引入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
// 实例化当前类里面的注解以及将要测试的controller加入上下文
private MockMvc mvc;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mvc = MockMvcBuilders.standaloneSetup(alertRuleController).build();
}
- 上面就是开始测试前的准备的工作,完成对象模拟以及初始化好要测试的类
- 接下来我们进入测试环境,先看下我的实现类,里面有哪些需要mock行为
- 整个方法比较简单,主要是红线框需要模拟,因为它是一个查询数据库的代码,我们只是单纯进行模块测试,肯定拿不到数据库数据
// mock 行为,这一块根据实际业务来,我的仅供参考
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就是期望的结果,这里我对参数不感兴趣,所以全部是any()
Mockito.when(curd.queryListResult(any(), any())).thenReturn(queryListResult);
// 执行get请求
mvc.perform(MockMvcRequestBuilders.get("/alert/rule")).andExpect(MockMvcResultMatchers.status().is(200)).andReturn()
常见问题
上面的章节可以帮忙快速入门,接下来说一下我开始引入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行为的时候,需要注意参数,匹配上才会返回期望值,如果对参数不感兴趣,全部设置成any()即可再补充一点,post请求
mockMvc.perform(post(path).with(request -> {
request.setContent(new Gson().toJson(alertRule).getBytes());
request.setContentType("application/json");
return request;
}));