引入mock依賴力图,3版本以上支持了模擬final所修飾的對象
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.3.3</version>
<scope>test</scope>
</dependency>
使用mock做controller層測試
- controller類名為AlertRuleController
- AlertRuleController里面有引入Curd對象
// 先mock出來引入的curd對象
@Mock
private Curd curd;
// 再注入要測試的controller
@InjectMocks
private AlertRuleController alertRuleController
// 實(shí)例化當(dāng)前類里面的注解以及將要測試的controller加入上下文
private MockMvc mvc;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mvc = MockMvcBuilders.standaloneSetup(alertRuleController).build();
}
- 上面就是開始測試前的準(zhǔn)備的工作坪哄,完成對象模擬以及初始化好要測試的類
- 接下來我們進(jìn)入測試環(huán)境弟劲,先看下我的實(shí)現(xiàn)類您单,里面有哪些需要mock行為
- 整個方法比較簡單梯投,主要是紅線框需要模擬稻薇,因?yàn)樗且粋€查詢數(shù)據(jù)庫的代碼肮雨,我們只是單純進(jìn)行模塊測試遵堵,肯定拿不到數(shù)據(jù)庫數(shù)據(jù)
// mock 行為,這一塊根據(jù)實(shí)際業(yè)務(wù)來怨规,我的僅供參考
QueryListResult queryListResult = new QueryListResult();
List<Record> list = new ArrayList<>();
list.add(new SimpleRecord() {{put(StandardField.CONTENT, CONTENT);}});
queryListResult.setList(list);
queryListResult.setCount(1);
// when后面就是紅框代碼陌宿,thenReturn就是期望的結(jié)果,這里我對參數(shù)不感興趣波丰,所以全部是any()
Mockito.when(curd.queryListResult(any(), any())).thenReturn(queryListResult);
// 執(zhí)行g(shù)et請求
mvc.perform(MockMvcRequestBuilders.get("/alert/rule")).andExpect(MockMvcResultMatchers.status().is(200)).andReturn()
常見問題
上面的章節(jié)可以幫忙快速入門壳坪,接下來說一下我開始引入mock測試框架遇到的一些問題
依賴問題
<!-- 測試mvc所需 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
沒有返回想要的期望值,期望值為null
mock行為的時候掰烟,需要注意參數(shù)爽蝴,匹配上才會返回期望值,如果對參數(shù)不感興趣纫骑,全部設(shè)置成any()即可再補(bǔ)充一點(diǎn)蝎亚,post請求
mockMvc.perform(post(path).with(request -> {
request.setContent(new Gson().toJson(alertRule).getBytes());
request.setContentType("application/json");
return request;
}));