面向领导编程,公司开始使用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();
}