早上有個群友問了一個不錯的問題:檔案上傳的單元測試怎麼寫?後面也針對後端開發要不要學一下單元測試的話題聊了聊,個人是非常建議後端開發能夠學一下單元測試的。所以,今天特地拿出來寫一篇說說,並不是因為這有多難寫,而是作為出色的後端開發人員,單元測試如果你能考慮周到,那麼從程式碼結構,程式質量上都會有很大的提升。而實際開發過程中,很少有開發人員會特別關注這個方面。
言歸正傳,下面我們具體說說當碰到需要上傳檔案的介面,我們要如何寫單元測試!
先來回憶一下,普通介面的單元測試我們是如何寫的?看看我們入門例子中的單元測試:
@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/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您覺得本文不錯,歡迎Star
支援,您的關注是我堅持的動力!
歡迎關注我的公眾號:程式猿DD,獲得獨家整理的免費學習資源助力你的Java學習之路!另每週贈書不停哦~