junit - AssertJ:对于 Pojo 如何检查一个链式句子中的每个嵌套属性/字段

标签 junit assertj

拥有一个POJO,例如:

public class ClientWebRequest {

    private URI uri;
    private HttpMethod httpMethod;

    private final Header header;
    private final Body body;


    public ClientWebRequest(){
        header = new Header();
        body = new Body();
    }

    //getters and setters
}

关于 JUnitAssertJ 配合使用,以下内容有效,@Test 方法通过:

assertThat(clientWebRequest).isNotNull();
assertThat(clientWebRequest.getHeader()).isNotNull();
assertThat(clientWebRequest.getHeader().getAccept()).isNotNull();
assertThat(clientWebRequest.getHeader().getAcceptLanguage()).isNull();
assertThat(clientWebRequest.getHeader().getContentType()).isNull();
assertThat(clientWebRequest.getBody()).isNotNull();
assertThat(clientWebRequest.getBody().getBody()).isNull();

即使它有效,在某种程度上也很冗长。

我想知道是否可能用一句话重写所有上述内容,检查每个嵌套属性/字段。因此,我尝试了以下方法:

assertThat(clientWebRequest.getHeader()).isNotNull()
        .hasFieldOrProperty("accept").isNotNull()
        .hasFieldOrProperty("acceptLanguage").isNull();

但失败并显示以下错误消息:

org.junit.ComparisonFailure: expected:<null> 
but was:<Header [accept=[application/json;charset=UTF-8], acceptLanguage=null, contentType=null]>
        at

我的主要目标是为 POJO 的每个属性/字段使用 isNotNullisNull 解决方案

Alpha:感谢 Joel 的建议,现在可以进行以下操作:

assertThat(clientWebRequest).isNotNull()
                            .extracting("header.accept")
                            .doesNotContainNull();

assertThat(clientWebRequest).isNotNull()
        .extracting("header.acceptLanguage", "header.contentType")
       .containsNull();

从上面(两个 block )如果我尝试以下(一个 block ):

assertThat(clientWebRequest).isNotNull()
                            .extracting("header.accept")
                            .doesNotContainNull();
       .extracting("header.acceptLanguage", "header.contentType")
       .containsNull();

失败了。只是好奇是否可以应用一个 block 。

最佳答案

我认为最好的方法是extract所有属性/字段,然后检查它不包含 null。

示例:

TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);

// support nested properties: 
assertThat(frodo).extracting("name", "age", "race.name")
                 .doesNotContainNull()
                 .containsExactly("Frodo", 33, "Hobbit");

请注意,您还可以使用 lambdas to extract values来自被测对象。

assertThat(frodo).extracting(TolkienCharacter::getName,
                             character -> character.age,
                             character -> character.getRace().getName())
                 .containsExactly("Frodo", 33, "Hobbit");

关于junit - AssertJ:对于 Pojo 如何检查一个链式句子中的每个嵌套属性/字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47969970/

相关文章:

java - AssertJ 记录断言结果

java - 泛型和 ClassCastException : why do I get this exception, 我该如何处理 "work around"呢?

intellij-idea - 在 IntelliJ IDEA 中运行测试时出现 java.lang.NoSuchMethodError

java - 文件的 Junit 测试用例

java - 用 mockito 模拟单例

java - 2 个 JUnit 断言类之间的差异

java - 使用 AssertJ 1.x 软断言断言该方法不会抛出异常

testing - 使用 junit 在类中的每个测试之前运行 DropwizardAppRule

java - 如何在 Maven 中的 exceptedGroups 中运行单元测试

java - 从 throwable 获取正文详细信息,并断言抛出异常时返回了确切的消息