整合測試時 MockMvc 無法注入

程式設計師小航發表於2022-06-16

如果閱讀過 使用 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多平臺釋出

相關文章