美文网首页
开始使用mock进行模块化单元测试

开始使用mock进行模块化单元测试

作者: 刘书生 | 来源:发表于2021-01-19 14:41 被阅读0次

引入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行为
image.png
  • 整个方法比较简单,主要是红线框需要模拟,因为它是一个查询数据库的代码,我们只是单纯进行模块测试,肯定拿不到数据库数据
// 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;
        }));

相关文章

网友评论

      本文标题:开始使用mock进行模块化单元测试

      本文链接:https://www.haomeiwen.com/subject/pedqzktx.html