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

Man*_*dan 5 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
Run Code Online (Sandbox Code Playgroud)

关于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();
Run Code Online (Sandbox Code Playgroud)

即使工作,在某种程度上也是冗长的。

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

    assertThat(clientWebRequest.getHeader()).isNotNull()
                                           .hasFieldOrProperty("accept").isNotNull()
                                           .hasFieldOrProperty("acceptLanguage").isNull();
Run Code Online (Sandbox Code Playgroud)

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

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

我的主要目标是工作与周围isNotNullisNull为每个属性/字段POJO

Alpha:由于Joel的建议,现在可以进行以下工作:

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

assertThat(clientWebRequest).isNotNull()
        .extracting("header.acceptLanguage", "header.contentType")
       .containsNull();
Run Code Online (Sandbox Code Playgroud)

从上方(两个方块),如果我尝试以下操作(一个方块):

assertThat(clientWebRequest).isNotNull()
                            .extracting("header.accept")
                            .doesNotContainNull();
       .extracting("header.acceptLanguage", "header.contentType")
       .containsNull();
Run Code Online (Sandbox Code Playgroud)

它失败。只是好奇是否有可能套用一格

Joe*_*ola 9

我认为最好的方法是提取所有属性/字段,然后检查其中是否不包含null。

例:

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

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

请注意,您还可以使用lambda来从被测对象中提取值

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

  • 这是行不通的,因为在应用“提取”之后,您最终会对与提取的属性相对应的值集合执行断言。如果您再次使用“提取”,它将尝试从先前值集合的每个元素中提取属性。 (2认同)