先來回憶一下,普通接口的單元測試我們是如何寫的?看看我們?nèi)腴T例子中的單元測試:
@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請求的提交并指定相關(guān)的期望返回來完成。
對于文件上傳接口,本質(zhì)上還是http請求的處理,所以MockMvc依然逃不掉,就是上傳內(nèi)容發(fā)生了改變,我們只需要去找一下文件上傳的模擬對象是哪個,就可以輕松完成這個任務(wù)。
具體寫法如下:
@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的測試主體是不變的,無非就是請求類型和請求內(nèi)容發(fā)生了改變。
更多本系列免費(fèi)教程連載「點(diǎn)擊進(jìn)入?yún)R總目錄」
今天的這篇挺水,但是否習(xí)慣為自己的代碼編寫單元測試以及能否寫好單元測試,是很能看出開發(fā)者編碼水平的。
所以,我是非常推薦大家能夠在編寫業(yè)務(wù)實(shí)現(xiàn)的時候,一并為自己的實(shí)現(xiàn)寫寫單元測試,看看是不是單元測試好寫,如果不好寫,往往就是代碼結(jié)構(gòu)設(shè)計(jì)不太理想導(dǎo)致。水平高點(diǎn)的,甚至可以先定義好接口,并寫好單元測試,再去寫實(shí)現(xiàn)(傳說中的測試驅(qū)動開發(fā))。
今天的小水分享到這里結(jié)束,有更多想法可來公眾號、星球或社群交流!
#代碼示例
本文的相關(guān)例子可以查看下面?zhèn)}庫中的chapter4-3
目錄:
- Github:https://github.com/dyc87112/SpringBoot-Learning/open in new window
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/