代码之家  ›  专栏  ›  技术社区  ›  Rahul

如何使用junit测试模型类以覆盖字段验证?

  •  0
  • Rahul  · 技术社区  · 2 年前

    我正在为我的spring-boot应用程序使用junit和mockito编写单元测试用例。现在,我还想为请求模型类编写测试用例,以根据业务需求实现最低90%的代码覆盖率。

    请求模型类中有3个字段,如id、review和state。示例:如果请求正文中的id字段为null或为空,或者长度小于8,则应给出错误,例如id不应为null,id大小应为8。

    请求模型类代码如下。

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    
    public class Request {
    
        @NotNull(message = "{request.id.notNull}")
        @Size(min=8, max=8, message = "{request.id.size}")
        @Schema(type = "string", example="X1234567")
        private String id;
        
        @NotNull(message = "{request.revision.notNull}")
        @Schema(type = "integer", example="0")
        private Integer revision;
        
        @NotNull(message = "{request.state.notNull}")
        @Size(min=2,max=2,  message = "{request.state.size}")
        @Pattern(regexp="^(BB|Bb|bB|bb|MM|Mm|mM|mm)$", message= "{request.state.pattern}")
        @Schema(type = "string", example="BB", allowableValues = {"BB","Bb", "bB", "bb", "MM", "Mm", "mM", "mm"})
        private String state;
        
        @Override
        public String toString() {
            StringBuilder details = new StringBuilder();
            details.append("Id:"+this.id);
            details.append(" revision:"+this.revision);
            details.append(" state:"+this.state);
            return details.toString();
        }
    
    }
    

    如何为它编写测试用例,或者如何在单元测试中进行验证,并希望在单元测试中将toString()方法覆盖在内?

    0 回复  |  直到 2 年前
        1
  •  1
  •   Emanuel Trandafir    2 年前

    为了测试验证,您启动web层并发送一些带有一些错误的请求,这样您就可以测试后端验证。点击此处阅读更多关于MockMvc的信息: https://spring.io/guides/gs/testing-web/

    或者,您可以在不启动Spring上下文的情况下对其进行测试,只需使用默认验证器,如下所示:

    @Test
    void testNullId() {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    
        Request req = new Request(null, 123, "BB");
        Set<ConstraintViolation<Request>> result = validator.validate(req);
    
        assertThat(result).hasSize(1);
        var violation = result.iterator().next();
        assertThat(violation.getMessage()).isEqualTo("{request.id.notNull}");
    }
    

    这将使您能够创建更快的测试并快速获得反馈。例如,你可以写 @ParameterizedTest 在这里,您将指定inout(请求有效负载)和预期输出(约束冲突消息)的组合。

    对于 toString() 只需调用该方法并对返回的String断言:

    @Test
    void testToString() {
        Request req = new Request("aaa", 123, "BB");
    
        assertThat(req.toString()).isEqualTo("Id:aaa revision:123 state:BB");
    }