【问题标题】:How to write junit test cases for below exception handling code?如何为以下异常处理代码编写junit测试用例?
【发布时间】: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 方法……您尝试了吗?
  • 谢谢您的回复先生,我没有尝试使用模拟错误对象...您能帮我吗?

标签: spring-boot junit spring-data-jpa controller mockito


【解决方案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,其中包含您需要的所有数据。

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多