檔案上傳的單元測試怎麼寫?

程式猿DD發表於2021-01-11

早上有個群友問了一個不錯的問題:檔案上傳的單元測試怎麼寫?後面也針對後端開發要不要學一下單元測試的話題聊了聊,個人是非常建議後端開發能夠學一下單元測試的。所以,今天特地拿出來寫一篇說說,並不是因為這有多難寫,而是作為出色的後端開發人員,單元測試如果你能考慮周到,那麼從程式碼結構,程式質量上都會有很大的提升。而實際開發過程中,很少有開發人員會特別關注這個方面。

言歸正傳,下面我們具體說說當碰到需要上傳檔案的介面,我們要如何寫單元測試!

先來回憶一下,普通介面的單元測試我們是如何寫的?看看我們入門例子中的單元測試:

@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目錄:

如果您覺得本文不錯,歡迎Star支援,您的關注是我堅持的動力!

歡迎關注我的公眾號:程式猿DD,獲得獨家整理的免費學習資源助力你的Java學習之路!另每週贈書不停哦~

相關文章