Spring Boot是一個非常流行的web框架,在web應用程序的構建和單元測試中,我們需要模擬http請求和響應來進行測試,MockMvc框架就是為此而設計的。MockMvc框架可以模擬完整的http請求和響應,測試web應用程序的控制器和服務層。
一、MockMvc框架基礎
MockMvc框架包括MockMvcBuilders,它可以用於創建MockMvc類的對象。MockMvcBuilder定義了完整的Spring MVC環境,它可以自定義SpringMvc應用程序的配置。
以下是使用Spring Boot和MockMvc的基本測試代碼:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyControllerTests { @Autowired private MockMvc mockMvc; @Test public void test() throws Exception { mockMvc.perform(get("/myController/test")) .andExpect(status().isOk()) .andExpect(content().string("Hello World!")); } }
在這個測試代碼中,我們使用了@SpringBootTest注釋來啟用Spring Boot測試的自動配置,使得我們可以使用Spring Boot的自動配置來載入Spring應用程序上下文。
使用@AutoConfigureMockMvc注釋,我們可以自動配置MockMvc。在此處,我們注入MockMvc對象,並使用perform()方法執行http GET請求。使用andExpect()方法檢查響應狀態碼和響應體內容。
二、使用MockMvc框架測試控制器層
MockMvc框架可以很好的測試控制器層,我們可以使用模擬請求來測試控制器的各種HTTP方法。MockMvc還提供了一些有用的方法來模擬請求參數、頭、cookie和會話等內容。以下是一個示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyControllerTests { @Autowired private MockMvc mockMvc; @Test public void test() throws Exception { mockMvc.perform(get("/myController/test")) .andExpect(status().isOk()) .andExpect(content().string("Hello World!")); } @Test public void paramTest() throws Exception { mockMvc.perform(get("/myController/testParam") .param("name", "Tom")) .andExpect(status().isOk()) .andExpect(content().string("Hello Tom")); } @Test public void postTest() throws Exception { mockMvc.perform(post("/myController/testPost") .contentType(MediaType.APPLICATION_JSON) .content("{\"name\":\"Tom\"}")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("Tom")); } }
在這個測試代碼中,我們演示了如何測試GET, POST方法和帶參數的請求。在第二個測試中,我們使用param()方法設置請求參數,然後檢查響應內容。在第三個測試中,我們使用了post()方法來模擬POST請求,然後檢查響應的JSON內容。
三、使用MockMvc框架測試服務層
MockMvc框架可以使用Mockito、JUnit和Hamcrest等框架,測試服務層Spring Bean。在服務層的測試中,我們通常使用Mockito來模擬依賴的服務。以下是一個示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyServiceTests { @MockBean private MyDAO myDAO; @Autowired private MyService myService; @Test public void test() throws Exception { when(myDAO.findByName("Tom")).thenReturn(new MyEntity("Tom")); String result = myService.getName("Tom"); assertEquals(result, "Tom"); } }
在這個測試代碼中,我們使用@MockBean來注入一個模擬的MyDAO對象到Spring上下文中。在測試中,我們對myDAO進行了模擬,並使用when()方法定義方法參數和返回值。然後,我們調用myService.getName()方法來測試服務層的功能。
四、使用MockMvc框架測試異常
MockMvc框架也可以很好的測試異常的場景。以下是一個示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MyControllerTests { @Autowired private MockMvc mockMvc; @Test public void testException() throws Exception { mockMvc.perform(get("/myController/error")) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.message").value("Bad Request")); } }
在這個測試代碼中,我們使用perform()方法來執行一個GET請求,其中我們調用了/myController/error介面,該介面會給出一個BadRequest響應。在測試中,我們使用andExpect()方法檢查響應狀態碼和響應體內容。如果響應類型不是BadRequest,測試會失敗。
五、結論
在Spring Boot應用程序中,MockMvc框架是一種非常方便實用的測試框架,它可以很好地測試web應用程序的控制器和服務層。在我們的測試中,我們可以使用Mockito模擬依賴的服務,在測試環境中模擬請求和響應。MockMvc還提供了很多有用的方法,如模擬請求參數、請求頭、cookie和會話等。MockMvc框架還可以很好的測試異常場景。總之,MockMvc框架提供了一種非常簡單、靈活的方式來測試Spring Boot應用程序,可以幫助我們更快地開發高質量的web應用程序。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/235837.html