AssertJ:对于 Pojo 如何检查一个链式句子中的每个嵌套 Property/Field
AssertJ: For a Pojo how to check each nested Property/Field in one chained sentence
有一个 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();
即使有效,在某些方面也很冗长。
我想知道是否可能用一句话重写以上所有内容,检查每个嵌套property/field。因此,我尝试了以下示例:
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
的每个 property/field 使用 isNotNull
和 isNull
解决方法
Alpha:感谢 Joel
的建议,以下内容现在有效:
assertThat(clientWebRequest).isNotNull()
.extracting("header.accept")
.doesNotContainNull();
assertThat(clientWebRequest).isNotNull()
.extracting("header.acceptLanguage", "header.contentType")
.containsNull();
从上面(两个块)如果我尝试以下(一个块):
assertThat(clientWebRequest).isNotNull()
.extracting("header.accept")
.doesNotContainNull();
.extracting("header.acceptLanguage", "header.contentType")
.containsNull();
失败了。只是好奇是否可以应用 one 块。
我认为最好的方法是extract所有properties/fields然后检查它不包含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");
有一个 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();
即使有效,在某些方面也很冗长。
我想知道是否可能用一句话重写以上所有内容,检查每个嵌套property/field。因此,我尝试了以下示例:
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
isNotNull
和 isNull
解决方法
Alpha:感谢 Joel
的建议,以下内容现在有效:
assertThat(clientWebRequest).isNotNull()
.extracting("header.accept")
.doesNotContainNull();
assertThat(clientWebRequest).isNotNull()
.extracting("header.acceptLanguage", "header.contentType")
.containsNull();
从上面(两个块)如果我尝试以下(一个块):
assertThat(clientWebRequest).isNotNull()
.extracting("header.accept")
.doesNotContainNull();
.extracting("header.acceptLanguage", "header.contentType")
.containsNull();
失败了。只是好奇是否可以应用 one 块。
我认为最好的方法是extract所有properties/fields然后检查它不包含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");