如果閱讀過 使用 Junit 編寫單元測試 的小夥伴都知道,在寫對 Controller 進行單元測試時,會將 Service 層進行 Mock。
大概樣子如下:
但是除了單元測試,還需要寫整合測試,就是模擬全流程的請求。
整合測試同樣使用的是 MockMvc,但是如果像單元測試一樣加上 @WebMvcTest 就不太可以,因為 Service 程式碼沒有 mock 掉,就會報錯。
可以用以下兩種方式解決該問題:
方法一
移除 @Autowired 註解,並手動宣告 MockMvc。
在 @Before 中使用 MockMvcBuilders.webAppContextSetup 即可手動宣告 MockMvc。
@WebAppConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserInfoControllerTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
// ... 省略
}
方法二
使用 @AutoConfigureMockMvc 註解,這樣就可以使用 @Autowired 即可注入 MockMvc 物件。
@WebAppConfiguration
@AutoConfigureMockMvc(addFilters = false)
@RunWith(SpringRunner.class)
@SpringBootTest
public class AccessRecordControllerTest {
@Autowired
private MockMvc mockMvc;
// ... 省略
}
注意:
需要新增 addFilters = false 否則可能會導致走 AntBuservice 過濾器,導致需要登入,從而整合測試失敗
本文由mdnice多平臺釋出