先来回忆一下,普通接口的单元测试我们是如何写的?看看我们入门例子中的单元测试:
@SpringBootTest
public class Chapter11ApplicationTests {
private MockMvc mvc;
@Before
public void setUp() {
mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
}
@Test
public void getHello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().string(equalTo("Hello World")));
}
}
这里我们所用到的核心是MockMvc工具,通过模拟http请求的提交并指定相关的期望返回来完成。
对于文件上传接口,本质上还是http请求的处理,所以MockMvc依然逃不掉,就是上传内容发生了改变,我们只需要去找一下文件上传的模拟对象是哪个,就可以轻松完成这个任务。
具体写法如下:
@SpringBootTest(classes = Chapter43Application.class)
public class FileTest {
@Autowired
protected WebApplicationContext context;
protected MockMvc mvc;
@BeforeEach
public void setUp() {
mvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void uploadFile() throws Exception {
MockMultipartFile file = new MockMultipartFile(
"file",
"hello.txt",
MediaType.TEXT_PLAIN_VALUE,
"Hello, World!".getBytes()
);
final MvcResult result = mvc.perform(
MockMvcRequestBuilders
.multipart("/upload")
.file(file))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
}
}
可以看到MockMvc的测试主体是不变的,无非就是请求类型和请求内容发生了改变。
更多本系列免费教程连载「点击进入汇总目录」
今天的这篇挺水,但是否习惯为自己的代码编写单元测试以及能否写好单元测试,是很能看出开发者编码水平的。
所以,我是非常推荐大家能够在编写业务实现的时候,一并为自己的实现写写单元测试,看看是不是单元测试好写,如果不好写,往往就是代码结构设计不太理想导致。水平高点的,甚至可以先定义好接口,并写好单元测试,再去写实现(传说中的测试驱动开发)。
今天的小水分享到这里结束,有更多想法可来公众号、星球或社群交流!
#代码示例
本文的相关例子可以查看下面仓库中的chapter4-3
目录:
- Github:https://github.com/dyc87112/SpringBoot-Learning/open in new window
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/