Junit AssertJ:对于Pojo,如何在一个链式语句中检查每个嵌套属性/字段

Junit AssertJ:对于Pojo,如何在一个链式语句中检查每个嵌套属性/字段,junit,assertj,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 Bod

具有
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
}
关于
JUnit
使用
AssertJ
以下内容有效,
@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
从上面(两个街区)如果我尝试以下(一个街区):


它失败了。只是想知道是否可以应用一个块。

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

例如:

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

// support nested properties: 
assertThat(frodo).extracting("name", "age", "race.name")
                 .doesNotContainNull()
                 .containsExactly("Frodo", 33, "Hobbit");
请注意,您还可以从测试对象中使用

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

谢谢,请查看添加的Alpha部分。不确定是否可以使用一个块。这不起作用,因为在应用
提取
后,您最终会对与提取的属性对应的值集合执行断言。如果再次使用
extracting
,它将尝试从上一个值集合的每个元素中提取属性。如果
character.getRace()
为null,会发生什么情况,测试用例不会因为NullPointerException而崩溃?是的,您会得到一个NPE
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);

// support nested properties: 
assertThat(frodo).extracting("name", "age", "race.name")
                 .doesNotContainNull()
                 .containsExactly("Frodo", 33, "Hobbit");
assertThat(frodo).extracting(TolkienCharacter::getName,
                             character -> character.age,
                             character -> character.getRace().getName())
                 .containsExactly("Frodo", 33, "Hobbit");