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

pwuypxnk  于 2023-05-06  发布在  Spring
关注(0)|答案(1)|浏览(103)

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

请求模型类有id、revision、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()方法?

njthzxwz

njthzxwz1#

为了测试验证,您启动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 s,其中您将指定inout(请求有效负载)和预期输出(约束违反消息)的组合。
对于toString(),只需在返回的String上调用method和assert:

@Test
void testToString() {
    Request req = new Request("aaa", 123, "BB");

    assertThat(req.toString()).isEqualTo("Id:aaa revision:123 state:BB");
}

相关问题