当前位置: 首页 > 知识库问答 >
问题:

JUnit测试错误地通过了错误的参数

苏野
2023-03-14

我试图测试一个控制器的方法,并得到适当的异常。它仅对ConstraintViolationExcture(javax.validation)失败,而对其他测试(如MisSingServletRequest estParameterExcture或METHOArgumentTypeMismatchExcture)则按预期工作。

下面是我的代码的一部分,在控制器(@验证)中,在我添加这些注释的方法中。还有控制建议和测试。邮递员,当我把错误的参数返回正确的响应:{"value": 500,"name":"ConstraintViolationExcema","Message":"The Param1 is right"},但是由于一些奇怪的原因,JUnit要求200而不是500。

控制器

    @ResponseBody
    public Board method(@Min(value = 0) @Max(value = 5)  @RequestParam(value = "param1", required = true) int param1,
                     @Min(value = 0) @Max(value = 1)  @RequestParam(value = "param2", required = true) int param3){
        return service.meth(param1, param2);
    }

控制器建议

    @ExceptionHandler(value = ConstraintViolationException.class)
    public ErrorResponse handleInternalServerErrors(HttpServletRequest request, Exception ex) {
        String message = "";
        if(ex instanceof ConstraintViolationException) {
            Map<String, Collection<String>> errors = new LinkedHashMap<>();
            final String[] queryParam = {""};
            ((ConstraintViolationException) ex).getConstraintViolations().forEach(constraintViolation -> {
                String queryParamPath = constraintViolation.getPropertyPath().toString();
                queryParam[0] = queryParamPath.contains(".") ?
                        queryParamPath.substring(queryParamPath.indexOf(".") + 1) :
                        queryParamPath;
            });
            message = "The " + queryParam[0] + " is wrong";
        }

        return new ErrorResponse(
                HttpStatus.INTERNAL_SERVER_ERROR.value(),
                ex.getClass().getSimpleName(),
                message);
    }

测验

 @Test
    void TryToGetException() throws Exception {
        given(service.meth(1231,1231)).willReturn(new CustObj());
        MockHttpServletResponse response = mvc.perform(get("/endpoint")
                .param("param1", "1231")
                .param("param2", "1231")

        ).andReturn().getResponse();

        assertEquals(response.getStatus(), HttpStatus.INTERNAL_SERVER_ERROR.value());
    }

预计:200实际:500

为了在测试中获得异常,我应该更改什么?

提前谢谢你!

共有1个答案

幸越泽
2023-03-14
private MockMvc mvcContext;
@Autowired
private WebApplicationContext context;
@BeforeEach
public void setUp() {
    mvcContext = MockMvcBuilders
            .webAppContextSetup(context)
            .build();
}

通过使用webAppContextSetup,问题得以解决。它考虑了@Min、@Max(在我的例子中,genarally是@Valid注释),因此我可以使用异常来测试它!

@Test
void testConstraintViolationException() throws Exception {
   MockHttpServletResponse response = mvcContext.perform(get("/endpoint")
            .param("param1", "1231")
            .param("param2", "1231")
    assertEquals(response.getStatus(), HttpStatus.INTERNAL_SERVER_ERROR.value());
}
 类似资料:
  • 当在我的pom.xml中启用强制使用JUnit47提供程序时,我得到: pom.xml如下所示

  • 这是我的pom文件,我已经升级到springboot2.5.12,我需要更新或添加任何其他依赖项吗? 我的Junit测试用例抛出此错误 原因:java。lang.ClassNotFoundException:Reactor。util。上下文java的ContextView。基本/jdk。内部的装载机。内置ClassLoader。java上的loadClass(BuiltinClassLoader.

  • 问题内容: 我对JUnit还是很陌生,我真的不知道对于异常和异常处理有什么最佳实践。 例如,假设我正在为IPAddress类编写测试。它具有一个构造函数IPAddress(String addr),如果addr为null,则将抛出InvalidIPAddressException。据我可以从谷歌搜索中得知,对null参数的测试将如下所示。 在这种情况下,try / catch很有意义,因为我知道异

  • 使用Broadleaf 5.2.2-GA版多租户版本 请帮助检查如何解决此错误。

  • 詹金斯设置 我不使用任何源代码管理方法,因此我将其保留为非 在全局工具配置下 > JDK安装已设置为自动安装 Maven配置设置为, > 文件路径=C:\Users***。m2\设置。xml 默认全局设置提供程序=使用默认maven全局设置 TestNg文件 POM文件