单元测试—模拟方法异常执行


面向领导编程,公司开始使用SonarQube做代码检查了。又逼着自己学习新技能。

单元测试 -- 模拟方法异常执行

使用@Test及其属性expected

只能校验异常类型,没法校验异常信息

@Test(expected = NestedServletException.class)
public void recallMessageError1() throws Exception {
    RecallMessageDTO recallMessageDTO = new RecallMessageDTO();
    recallMessageDTO.setFromUserId("");
    recallMessageDTO.setTargetId("1131762050372997120");
    recallMessageDTO.setConversationType(ConversationTypeEnum.CONVERSATION_TYPE_1.getType());
    recallMessageDTO.setSentTime("1624368676049");
    recallMessageDTO.setMessageUID("BQ6F-LFPK-87A7-G4SG");
 
    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
            .post("/v1/recall_message")
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(recallMessageDTO));
            
	MvcResult result = mockMvc.perform(requestBuilder) //执行请求
		.andExpect(status().isInternalServerError()) //验证服务器内部错误
		.andReturn();
}

使用try-catch

可以在一个方法里使用try catch校验各种异常类型

@Test
public void recallMessageError2() throws Exception {
    RecallMessageDTO recallMessageDTO = new RecallMessageDTO();
    recallMessageDTO.setFromUserId("");
    recallMessageDTO.setTargetId("1131762050372997120");
    recallMessageDTO.setConversationType(ConversationTypeEnum.CONVERSATION_TYPE_1.getType());
    recallMessageDTO.setSentTime("1624368676049");
    recallMessageDTO.setMessageUID("BQ6F-LFPK-87A7-G4SG");
     
    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
            .post("/v1/recall_message")
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(recallMessageDTO));
 
    try{
        //异常处理
        MvcResult result = mockMvc.perform(requestBuilder) //执行请求
                .andExpect(status().isInternalServerError()) //验证服务器内部错误
                .andReturn();
    }catch (NestedServletException e) {
        Assert.assertEquals("消息发送人ID不能为空", e.getCause().getMessage());
    }
}

使用@Rule和ExpectedException

ExpectedException从4.7之后才有的,可以让你优雅的测试异常类型和异常信息

@Rule
public ExpectedException thrown = ExpectedException.none();
 
@Test
public void recallMessageError() throws Exception {
    // 不填写发件人
    RecallMessageDTO recallMessageDTO = new RecallMessageDTO();
    recallMessageDTO.setFromUserId("");
    recallMessageDTO.setTargetId("1131762050372997120");
    recallMessageDTO.setConversationType(ConversationTypeEnum.CONVERSATION_TYPE_1.getType());
    recallMessageDTO.setSentTime("1624368676049");
    recallMessageDTO.setMessageUID("BQ6F-LFPK-87A7-G4SG");
 
    thrown.expect(NestedServletException.class);
    thrown.expectMessage("消息发送人ID不能为空");
 
    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders
            .post("/v1/recall_message")
            .accept(MediaType.APPLICATION_JSON)
            .contentType(MediaType.APPLICATION_JSON)
            .content(objectMapper.writeValueAsString(recallMessageDTO));
 
    MvcResult mvcResult = mockMvc.perform(requestBuilder)
            .andDo(print()) //打印输出发出请求的详细信息
            .andExpect(status().isOk())
            .andReturn();
 
}

文章作者: WangQingLei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 WangQingLei !
 上一篇
单元测试—参数化测试 单元测试—参数化测试
在写单元测试的时候经常会遇到一种情况,针对某个方法使用多组入参进行测试,这时可以每组入参写一个测试方法,但代码重复率高不优雅,而 junit 从 4.0 开始提供了一种叫做参数化测试的方式专门处理这样情况。
2021-07-03
下一篇 
Git(6) -- diff文件差异 Git(6) -- diff文件差异
git diff 命令用来显示已写入暂存区和已经被修改但尚未写入暂存区文件对区别。
2021-07-02
  目录