如何为以下异常处理代码编写junit测试用例?

Posted

技术标签:

【中文标题】如何为以下异常处理代码编写junit测试用例?【英文标题】:How to write junit test cases for below exception handling code? 【发布时间】:2021-12-13 09:27:08 【问题描述】:
@PostMapping("/addCompany")
public Company createCompany(@Valid @RequestBody Company company, Errors errors) 
    if (errors.hasErrors()) 
        throw new ValidationException(errors.getFieldError().getDefaultMessage());
    
    return companyService.addCompany(company);

【问题讨论】:

您只需使用模拟的Errors 对象调用createCompany 方法……您尝试了吗? 谢谢您的回复先生,我没有尝试使用模拟错误对象...您能帮我吗? 【参考方案1】:

您可以通过两种方式对其进行测试:

控制器单元测试 Web 层测试

单元测试:

模拟 Errors 并调用 createCompany 并将该模拟作为参数。 验证是否抛出异常

Web层测试:

使用mockMvc 发布无效请求 检查是否返回错误代码
@WebMvcTest(CompanyController.class)
class CompanyControllerTest 
    private static final String CREATE_COMPANY_ENDPOINT = "/addCompany/";

    @Autowired
    private MockMvc mockMvc;

    @Test
    void respondsWith4xxOnInvalidCreateCompanyRequest() throws Exception 
        String invalidRequest = "\"id\":\"aaa\", \"name\":\"bbb\""
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders
                .post(CREATE_COMPANY_ENDPOINT)
                .content(invalidRequest)
                .contentType(MediaType.APPLICATION_JSON_VALUE);

        this.mockMvc.perform(builder)
                    .andExpect(status().is4xxClientError());
    

在这种情况下,我非常喜欢 Web 层测试 - 你检查实际的验证逻辑。 Mocking Errors 除了代码覆盖率之外什么都没有。

最重要的是:

您对验证错误的处理是微不足道的。如果您从参数列表中删除Errors,则在输入无效时,Spring 将抛出MethodArgumentNotValidExceptionBindingResult,其中包含您需要的所有数据。

【讨论】:

以上是关于如何为以下异常处理代码编写junit测试用例?的主要内容,如果未能解决你的问题,请参考以下文章

为 Java 中的自定义检查异常编写 JUnit 测试用例?

如何为 Spring 托管 bean 编写 Junit 测试用例?

如何为 Rest 模板编写 Mockito Junit 测试用例?

如何为配置类编写@Bean的junit案例

如何为以下代码段编写单元测试用例

如何为具有spring存储库代码的@Component类编写集成测试?