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

引入mock依赖,3版本以上支持了模拟final所修饰的对象

            
                org.mockito
                mockito-core
                3.3.3
                test
            

使用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 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测试框架遇到的一些问题

  • 依赖问题

        
        
            javax.servlet
            javax.servlet-api
            provided
        

        
            org.springframework
            spring-webmvc
        
  • 没有返回想要的期望值,期望值为null
    mock行为的时候,需要注意参数,匹配上才会返回期望值,如果对参数不感兴趣,全部设置成any()即可

  • 再补充一点,post请求

        mockMvc.perform(post(path).with(request -> {
            request.setContent(new Gson().toJson(alertRule).getBytes());
            request.setContentType("application/json");
            return request;
        }));

你可能感兴趣的:(开始使用mock进行模块化单元测试)