SELF
- the "self" type of this assertion class. Please read "Emulating 'self types' using Java Generics to simplify fluent API implementation"
for more details.ACTUAL
- the type of the "actual" value.public abstract class AbstractObjectAssert<SELF extends AbstractObjectAssert<SELF,ACTUAL>,ACTUAL> extends AbstractAssert<SELF,ACTUAL>
Object
s.actual, info, myself, throwUnsupportedExceptionOnEquals
Constructor and Description |
---|
AbstractObjectAssert(ACTUAL actual,
Class<?> selfType) |
Modifier and Type | Method and Description |
---|---|
SELF |
as(Description description)
Sets the description of the assertion that is going to be called after.
|
SELF |
as(String description,
Object... args)
Sets the description of the assertion that is going to be called after.
|
AbstractObjectAssert<?,?> |
extracting(Function<? super ACTUAL,? extends Object> extractor)
Uses the given
Function to extract a value from the object under test, the extracted value becoming the new object under test. |
AbstractListAssert<?,List<? extends Object>,Object,ObjectAssert<Object>> |
extracting(Function<? super ACTUAL,Object>... extractors)
Uses the given
Function s to extract the values from the object under test into a list, this new list becoming
the object under test. |
AbstractListAssert<?,List<? extends Object>,Object,ObjectAssert<Object>> |
extracting(String... propertiesOrFields)
Extracts the values of given fields/properties from the object under test into a list, this new list becoming
the object under test.
|
protected TypeComparators |
getComparatorsByType() |
SELF |
hasAllNullFieldsOrProperties()
Asserts that the actual object has only null fields or properties.
|
SELF |
hasAllNullFieldsOrPropertiesExcept(String... propertiesOrFieldsToIgnore)
Asserts that the actual object has only null fields or properties except for the given ones
(inherited ones are taken into account).
|
SELF |
hasFieldOrProperty(String name)
Asserts that the actual object has the specified field or property.
|
SELF |
hasFieldOrPropertyWithValue(String name,
Object value)
Asserts that the actual object has the specified field or property with the given value.
|
SELF |
hasNoNullFieldsOrProperties()
Asserts that the actual object has no null fields or properties (inherited ones are taken into account).
|
SELF |
hasNoNullFieldsOrPropertiesExcept(String... propertiesOrFieldsToIgnore)
Asserts that the actual object has no null fields or properties except for the given ones
(inherited ones are taken into account).
|
SELF |
isEqualToComparingFieldByField(Object other)
Asserts that actual object is equal to the given object based on a property/field by property/field comparison (including
inherited ones).
|
SELF |
isEqualToComparingFieldByFieldRecursively(Object other)
Asserts that the object under test (actual) is equal to the given object based on a recursive property/field by property/field comparison (including
inherited ones).
|
SELF |
isEqualToComparingOnlyGivenFields(Object other,
String... propertiesOrFieldsUsedInComparison)
Asserts that the actual object is equal to the given one using a property/field by property/field comparison on the given properties/fields only
(fields can be inherited fields or nested fields).
|
SELF |
isEqualToIgnoringGivenFields(Object other,
String... propertiesOrFieldsToIgnore)
Asserts that the actual object is equal to the given one by comparing their properties/fields except for the given ones
(inherited ones are taken into account).
|
SELF |
isEqualToIgnoringNullFields(Object other)
Asserts that the actual object is equal to the given one by comparing actual's properties/fields with other's
not null properties/fields only (including inherited ones).
|
protected AbstractObjectAssert<?,?> |
newObjectAssert(Object objectUnderTest) |
<T> SELF |
returns(T expected,
Function<ACTUAL,T> from)
Verifies that the object under test returns the given expected value from the given
Function ,
a typical usage is to pass a method reference to assert object's property. |
<T> SELF |
usingComparatorForFields(Comparator<T> comparator,
String... propertiesOrFields)
Allows to set a specific comparator to compare properties or fields with the given names.
|
<T> SELF |
usingComparatorForType(Comparator<? super T> comparator,
Class<T> type)
Allows to set a specific comparator to compare properties or fields with the given type.
|
RecursiveComparisonAssert<?> |
usingRecursiveComparison()
Enable using a recursive field by field comparison strategy when calling the chained
isEqualTo assertion. |
RecursiveComparisonAssert<?> |
usingRecursiveComparison(RecursiveComparisonConfiguration recursiveComparisonConfiguration)
Same as
usingRecursiveComparison() but allows to specify your own RecursiveComparisonConfiguration . |
asList, asString, describedAs, describedAs, descriptionText, doesNotHave, doesNotHaveSameClassAs, equals, failWithMessage, getWritableAssertionInfo, has, hashCode, hasSameClassAs, hasSameHashCodeAs, hasToString, inBinary, inHexadecimal, is, isEqualTo, isExactlyInstanceOf, isIn, isIn, isInstanceOf, isInstanceOfAny, isInstanceOfSatisfying, isNot, isNotEqualTo, isNotExactlyInstanceOf, isNotIn, isNotIn, isNotInstanceOf, isNotInstanceOfAny, isNotNull, isNotOfAnyClassIn, isNotSameAs, isNull, isOfAnyClassIn, isSameAs, matches, matches, newListAssertInstance, overridingErrorMessage, satisfies, satisfies, satisfiesAnyOf, satisfiesAnyOf, setCustomRepresentation, throwAssertionError, usingComparator, usingComparator, usingDefaultComparator, withFailMessage, withRepresentation, withThreadDumpOnError
public SELF as(Description description)
AbstractAssert
You must set it before calling the assertion otherwise it is ignored as the failing assertion breaks the chained call by throwing an AssertionError.
This overloaded version of "describedAs" offers more flexibility than the one taking a String
by allowing
users to pass their own implementation of a description. For example, a description that creates its value lazily,
only when an assertion failure occurs.
as
in interface Descriptable<SELF extends AbstractObjectAssert<SELF,ACTUAL>>
as
in class AbstractAssert<SELF extends AbstractObjectAssert<SELF,ACTUAL>,ACTUAL>
description
- the new description to set.this
object.Descriptable.describedAs(Description)
public SELF as(String description, Object... args)
AbstractAssert
You must set it before calling the assertion otherwise it is ignored as the failing assertion breaks the chained call by throwing an AssertionError.
The description follows String.format(String, Object...)
syntax.
Example :
try {
// set a bad age to Mr Frodo which is really 33 years old.
frodo.setAge(50);
// specify a test description (call as() before the assertion !), it supports String format syntax.
assertThat(frodo.getAge()).as("check %s's age", frodo.getName()).isEqualTo(33);
} catch (AssertionError e) {
assertThat(e).hasMessage("[check Frodo's age] expected:<[33]> but was:<[50]>");
}
as
in interface Descriptable<SELF extends AbstractObjectAssert<SELF,ACTUAL>>
as
in class AbstractAssert<SELF extends AbstractObjectAssert<SELF,ACTUAL>,ACTUAL>
description
- the new description to set.args
- optional parameter if description is a format String.this
object.Descriptable.describedAs(String, Object...)
public SELF isEqualToIgnoringNullFields(Object other)
It means that if an actual field is not null and the corresponding field in other is null, this field will be ignored in comparison, but the opposite will make assertion fail (null field in actual, not null in other) as the field is used in the performed comparison and the values differ.
Note that comparison is not recursive, if one of the field is an Object, it will be compared to the other
field using its equals
method.
If an object has a field and a property with the same name, the property value will be used over the field.
Private fields are used in comparison but this can be disabled using
Assertions.setAllowComparingPrivateFields(boolean)
, if disabled only accessible fields values are
compared, accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
The objects to compare can be of different types but the properties/fields used in comparison must exist in both, for example if actual object has a name String field, it is expected other object to also have one.
Example:
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
TolkienCharacter mysteriousHobbit = new TolkienCharacter(null, 33, HOBBIT);
// Null fields in other/expected object are ignored, the mysteriousHobbit has null name thus name is ignored
assertThat(frodo).isEqualToIgnoringNullFields(mysteriousHobbit); // OK
// ... but this is not reversible !
assertThat(mysteriousHobbit).isEqualToIgnoringNullFields(frodo); // FAIL
other
- the object to compare actual
to.this
assertion object.NullPointerException
- if the actual or other object is null
.AssertionError
- if the actual and the given object are not lenient equals.IntrospectionError
- if one of actual's field to compare can't be found in the other object.public SELF isEqualToComparingOnlyGivenFields(Object other, String... propertiesOrFieldsUsedInComparison)
equals
implementation of objects to compare does not suit you.
Note that comparison is not recursive, if one of the field is an Object, it will be compared to the other
field using its equals
method.
If an object has a field and a property with the same name, the property value will be used over the field.
Private fields are used in comparison but this can be disabled using
Assertions.setAllowComparingPrivateFields(boolean)
, if disabled only accessible fields values are
compared, accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
The objects to compare can be of different types but the properties/fields used in comparison must exist in both, for example if actual object has a name String field, it is expected the other object to also have one.
Example:
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
TolkienCharacter sam = new TolkienCharacter("Sam", 38, HOBBIT);
// frodo and sam both are hobbits, so they are equals when comparing only race
assertThat(frodo).isEqualToComparingOnlyGivenFields(sam, "race"); // OK
// they are also equals when comparing only race name (nested field).
assertThat(frodo).isEqualToComparingOnlyGivenFields(sam, "race.name"); // OK
// ... but not when comparing both name and race
assertThat(frodo).isEqualToComparingOnlyGivenFields(sam, "name", "race"); // FAIL
other
- the object to compare actual
to.propertiesOrFieldsUsedInComparison
- properties/fields used in comparison.this
assertion object.NullPointerException
- if the actual or other is null
.AssertionError
- if the actual and the given objects are not equals property/field by property/field on given fields.IntrospectionError
- if one of actual's property/field to compare can't be found in the other object.IntrospectionError
- if a property/field does not exist in actual.public SELF isEqualToIgnoringGivenFields(Object other, String... propertiesOrFieldsToIgnore)
equals
implementation of objects to compare does not suit you.
Note that comparison is not recursive, if one of the property/field is an Object, it will be compared to the other
field using its equals
method.
If an object has a field and a property with the same name, the property value will be used over the field.
Private fields are used in comparison but this can be disabled using
Assertions.setAllowComparingPrivateFields(boolean)
, if disabled only accessible fields values are
compared, accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
The objects to compare can be of different types but the properties/fields used in comparison must exist in both, for example if actual object has a name String field, it is expected the other object to also have one.
Example:
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
TolkienCharacter sam = new TolkienCharacter("Sam", 38, HOBBIT);
// frodo and sam are equals when ignoring name and age since the only remaining field is race which they share as HOBBIT.
assertThat(frodo).isEqualToIgnoringGivenFields(sam, "name", "age"); // OK
// ... but they are not equals if only age is ignored as their names differ.
assertThat(frodo).isEqualToIgnoringGivenFields(sam, "age"); // FAIL
other
- the object to compare actual
to.propertiesOrFieldsToIgnore
- ignored properties/fields to ignore in comparison.this
assertion object.NullPointerException
- if the actual or given object is null
.AssertionError
- if the actual and the given objects are not equals property/field by property/field after ignoring given fields.IntrospectionError
- if one of actual's property/field to compare can't be found in the other object.public SELF hasNoNullFieldsOrProperties()
If an object has a field and a property with the same name, the property value will be used over the field.
Private fields are checked, but this can be disabled using Assertions.setAllowComparingPrivateFields(boolean)
,
if disabled only accessible fields values are
checked, accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
Example:
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
TolkienCharacter sam = new TolkienCharacter("Sam", 38, null);
// assertion succeeds since all frodo's fields are set
assertThat(frodo).hasNoNullFieldsOrProperties();
// assertion fails because sam does not have its race set
assertThat(sam).hasNoNullFieldsOrProperties();
this
assertion object.AssertionError
- if the actual object is null
.AssertionError
- if some fields or properties of the actual object are null.public SELF hasAllNullFieldsOrProperties()
If an object has a field and a property with the same name, the property value will be used over the field.
Private fields are checked, but this can be disable using Assertions.setAllowComparingPrivateFields(boolean)
,
if disable only accessible fields values are checked,
accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
Example:
TolkienCharacter frodo = new TolkienCharacter(null, null, null);
TolkienCharacter sam = new TolkienCharacter("sam", null, null);
// assertion succeeds since all frodo's fields are null
assertThat(frodo).hasAllNullFieldsOrProperties();
// assertion fails because sam has its name set
assertThat(sam).hasAllNullFieldsOrProperties();
this
assertion object.AssertionError
- if the actual object is null
.AssertionError
- if some field or properties of the actual object are not null.public SELF hasNoNullFieldsOrPropertiesExcept(String... propertiesOrFieldsToIgnore)
If an object has a field and a property with the same name, the property value will be used over the field.
Private fields are checked, but this can be disabled using Assertions.setAllowComparingPrivateFields(boolean)
,
if disabled only accessible fields values are checked,
accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
Example:
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, null);
// assertion succeeds since frodo has only null field is race
assertThat(frodo).hasNoNullFieldsOrPropertiesExcept("race");
// ... but if we require the race field, the assertion fails
assertThat(frodo).hasNoNullFieldsOrPropertiesExcept("name", "age");
propertiesOrFieldsToIgnore
- properties/fields that won't be checked for null.this
assertion object.AssertionError
- if the actual object is null
.AssertionError
- if some (non ignored) fields or properties of the actual object are null.public SELF hasAllNullFieldsOrPropertiesExcept(String... propertiesOrFieldsToIgnore)
If an object has a field and a property with the same name, the property value will be user over the field.
Private fields are checked, but this can be disable using Assertions.setAllowComparingPrivateFields(boolean)
,
if disabled only accessible fields values are checked,
accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
Example:
TolkienCharacter frodo = new TolkienCharacter("Frodo", null, null);
// assertion succeeds since frodo has only non null field is name
assertThat(frodo).hasAllNullFieldsOrPropertiesExcept("name");
// ... but if we specify any field other than name, the assertion fails
assertThat(frodo).hasAllNullFieldsOrPropertiesExcept("race");
propertiesOrFieldsToIgnore
- properties/fields that won't be checked for not being null.this
assertion object.AssertionError
- if the actual object is null
.AssertionError
- if some (non ignored) fields or properties of the actual object are not null.public SELF isEqualToComparingFieldByField(Object other)
equals
implementation of objects to compare does not suit you.
Note that comparison is not recursive, if one of the field is an Object, it will be compared to the other
field using its equals
method.
If an object has a field and a property with the same name, the property value will be used over the field.
Private fields are used in comparison but this can be disabled using
Assertions.setAllowComparingPrivateFields(boolean)
, if disabled only accessible fields values are
compared, accessible fields include directly accessible fields (e.g. public) or fields with an accessible getter.
The objects to compare can be of different types but the properties/fields used in comparison must exist in both, for example if actual object has a name String field, it is expected the other object to also have one.
Example:
// equals not overridden in TolkienCharacter
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
TolkienCharacter frodoClone = new TolkienCharacter("Frodo", 33, HOBBIT);
// Fail as equals compares object references
assertThat(frodo).isEqualTo(frodoClone);
// frodo and frodoClone are equals when doing a field by field comparison.
assertThat(frodo).isEqualToComparingFieldByField(frodoClone);
other
- the object to compare actual
to.this
assertions objectAssertionError
- if the actual object is null
.AssertionError
- if the actual and the given objects are not equals property/field by property/field.IntrospectionError
- if one of actual's property/field to compare can't be found in the other object.protected TypeComparators getComparatorsByType()
public <T> SELF usingComparatorForFields(Comparator<T> comparator, String... propertiesOrFields)
Comparators specified by this method have precedence over comparators added by usingComparatorForType(java.util.Comparator<? super T>, java.lang.Class<T>)
.
The comparators specified by this method are only used for field by field comparison like isEqualToComparingFieldByField(Object)
.
When used with isEqualToComparingFieldByFieldRecursively(Object)
, the fields/properties must be specified from the root object,
for example if Foo class as a Bar field and Bar class has an id, to set a comparator for Bar's id use "bar.id"
.
Example:
public class TolkienCharacter {
private String name;
private double height;
// constructor omitted
}
TolkienCharacter frodo = new TolkienCharacter("Frodo", 1.2);
TolkienCharacter tallerFrodo = new TolkienCharacter("Frodo", 1.3);
TolkienCharacter reallyTallFrodo = new TolkienCharacter("Frodo", 1.9);
Comparator<Double> closeEnough = new Comparator<Double>() {
double precision = 0.5;
public int compare(Double d1, Double d2) {
return Math.abs(d1 - d2) <= precision ? 0 : 1;
}
};
// assertions will pass
assertThat(frodo).usingComparatorForFields(closeEnough, "height")
.isEqualToComparingFieldByField(tallerFrodo);
assertThat(frodo).usingComparatorForFields(closeEnough, "height")
.isEqualToIgnoringNullFields(tallerFrodo);
assertThat(frodo).usingComparatorForFields(closeEnough, "height")
.isEqualToIgnoringGivenFields(tallerFrodo);
assertThat(frodo).usingComparatorForFields(closeEnough, "height")
.isEqualToComparingOnlyGivenFields(tallerFrodo);
// assertion will fail
assertThat(frodo).usingComparatorForFields(closeEnough, "height")
.isEqualToComparingFieldByField(reallyTallFrodo);
T
- the type of values to compare.comparator
- the Comparator
to usepropertiesOrFields
- the names of the properties and/or fields the comparator should be used forthis
assertions objectpublic <T> SELF usingComparatorForType(Comparator<? super T> comparator, Class<T> type)
Comparators specified by usingComparatorForFields(java.util.Comparator<T>, java.lang.String...)
have precedence over comparators specified by this method.
The comparators specified by this method are only used for field by field comparison like isEqualToComparingFieldByField(Object)
.
Example:
public class TolkienCharacter {
private String name;
private double height;
// constructor omitted
}
TolkienCharacter frodo = new TolkienCharacter("Frodo", 1.2);
TolkienCharacter tallerFrodo = new TolkienCharacter("Frodo", 1.3);
TolkienCharacter reallyTallFrodo = new TolkienCharacter("Frodo", 1.9);
Comparator<Double> closeEnough = new Comparator<Double>() {
double precision = 0.5;
public int compare(Double d1, Double d2) {
return Math.abs(d1 - d2) <= precision ? 0 : 1;
}
};
// assertions will pass
assertThat(frodo).usingComparatorForType(closeEnough, Double.class)
.isEqualToComparingFieldByField(tallerFrodo);
assertThat(frodo).usingComparatorForType(closeEnough, Double.class)
.isEqualToIgnoringNullFields(tallerFrodo);
assertThat(frodo).usingComparatorForType(closeEnough, Double.class)
.isEqualToIgnoringGivenFields(tallerFrodo);
assertThat(frodo).usingComparatorForType(closeEnough, Double.class)
.isEqualToComparingOnlyGivenFields(tallerFrodo);
// assertion will fail
assertThat(frodo).usingComparatorForType(closeEnough, Double.class)
.isEqualToComparingFieldByField(reallyTallFrodo);
If multiple compatible comparators have been registered for a given type
, the closest in the inheritance
chain to the given type
is chosen in the following order:
type
type
type
T
- the type of objects that the comparator should be used forcomparator
- the Comparator
to usetype
- the Class
of the type the comparator should be used forthis
assertions objectpublic SELF hasFieldOrProperty(String name)
Private fields are matched by default but this can be changed by calling Assertions.setAllowExtractingPrivateFields(false)
.
Example:
public class TolkienCharacter {
private String name;
private int age;
// constructor omitted
public String getName() {
return this.name;
}
}
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33);
// assertions will pass :
assertThat(frodo).hasFieldOrProperty("name")
.hasFieldOrProperty("age"); // private field are matched by default
// assertions will fail :
assertThat(frodo).hasFieldOrProperty("not_exists");
assertThat(frodo).hasFieldOrProperty(null);
// disable looking for private fields
Assertions.setAllowExtractingPrivateFields(false);
assertThat(frodo).hasFieldOrProperty("age");
name
- the field/property name to checkthis
assertion object.AssertionError
- if the actual object is null
.IllegalArgumentException
- if name is null
.AssertionError
- if the actual object has not the given field/propertypublic SELF hasFieldOrPropertyWithValue(String name, Object value)
Private fields are matched by default but this can be changed by calling Assertions.setAllowExtractingPrivateFields(false)
.
If you are looking to chain multiple assertions on different properties in a type safe way, consider chaining returns(Object, Function)
calls.
Example:
public class TolkienCharacter {
private String name;
private int age;
// constructor omitted
public String getName() {
return this.name;
}
}
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33);
TolkienCharacter noname = new TolkienCharacter(null, 33);
// assertions will pass :
assertThat(frodo).hasFieldOrProperty("name", "Frodo");
assertThat(frodo).hasFieldOrProperty("age", 33);
assertThat(noname).hasFieldOrProperty("name", null);
// assertions will fail :
assertThat(frodo).hasFieldOrProperty("name", "not_equals");
assertThat(frodo).hasFieldOrProperty(null, 33);
assertThat(frodo).hasFieldOrProperty("age", null);
assertThat(noname).hasFieldOrProperty("name", "Frodo");
// disable extracting private fields
Assertions.setAllowExtractingPrivateFields(false);
assertThat(frodo).hasFieldOrProperty("age", 33);
name
- the field/property name to checkvalue
- the field/property expected valuethis
assertion object.AssertionError
- if the actual object is null
.IllegalArgumentException
- if name is null
.AssertionError
- if the actual object has not the given field/propertyAssertionError
- if the actual object has the given field/property but not with the expected valuehasFieldOrProperty(java.lang.String)
public AbstractListAssert<?,List<? extends Object>,Object,ObjectAssert<Object>> extracting(String... propertiesOrFields)
If you extract "id", "name" and "email" fields/properties then the list will contain the id, name and email values of the object under test, you can then perform list assertions on the extracted values.
Nested fields/properties are supported, specifying "adress.street.number" is equivalent to get the value corresponding to actual.getAdress().getStreet().getNumber()
Private fields can be extracted unless you call Assertions.setAllowExtractingPrivateFields(false)
.
If the object under test is a Map
with String
keys, extracting will extract values matching the given fields/properties.
Example:
// Create frodo, setting its name, age and Race (Race having a name property)
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
// let's verify Frodo's name, age and race name:
assertThat(frodo).extracting("name", "age", "race.name")
.containsExactly("Frodo", 33, "Hobbit");
A property with the given name is looked for first, if it doesn't exist then a field with the given name is looked
for, if the field is not accessible (i.e. does not exist) an IntrospectionError
is thrown.
Note that the order of extracted values is consistent with the order of the given property/field.
propertiesOrFields
- the properties/fields to extract from the initial object under testIntrospectionError
- if one of the given name does not match a field or propertypublic AbstractListAssert<?,List<? extends Object>,Object,ObjectAssert<Object>> extracting(Function<? super ACTUAL,Object>... extractors)
Function
s to extract the values from the object under test into a list, this new list becoming
the object under test.
If the given Function
s extract the id, name and email values then the list will contain the id, name and email values
of the object under test, you can then perform list assertions on the extracted values.
Example:
// Create frodo, setting its name, age and Race (Race having a name property)
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
// let's verify Frodo's name, age and race name:
assertThat(frodo).extracting(TolkienCharacter::getName,
character -> character.age, // public field
character -> character.getRace().getName())
.containsExactly("Frodo", 33, "Hobbit");
Note that the order of extracted values is consistent with the order of given extractor functions.
extractors
- the extractor functions to extract values from the Object under test.public AbstractObjectAssert<?,?> extracting(Function<? super ACTUAL,? extends Object> extractor)
Function
to extract a value from the object under test, the extracted value becoming the new object under test.
Note that since the value is extracted as an Object, only Object assertions can be chained after extracting.
Example:
// Create frodo, setting its name, age and Race
TolkienCharacter frodo = new TolkienCharacter("Frodo", 33, HOBBIT);
// let's extract and verify Frodo's name:
assertThat(frodo).extracting(TolkienCharacter::getName)
.isEqualTo("Frodo");
// The extracted value being a String, we would like to use String assertions but we can't due to Java generics limitations.
// The following assertion does NOT compile:
assertThat(frodo).extracting(TolkienCharacter::getName)
.startsWith("Fro");
extractor
- the extractor function used to extract the value from the object under test.ObjectAssert
instance whose object under test is the extracted valuepublic SELF isEqualToComparingFieldByFieldRecursively(Object other)
equals
implementation does not suit you.
The recursive property/field comparison is not applied on fields having a custom equals
implementation, i.e.
the overridden equals
method will be used instead of a field by field comparison.
The recursive comparison handles cycles. By default floats
are compared with a precision of 1.0E-6 and doubles
with 1.0E-15.
You can specify a custom comparator per (nested) fields or type with respectively usingComparatorForFields(Comparator, String...)
and usingComparatorForType(Comparator, Class)
.
The objects to compare can be of different types but must have the same properties/fields. For example if actual object has a name String field, it is expected the other object to also have one. If an object has a field and a property with the same name, the property value will be used over the field.
Example:
public class Person {
public String name;
public double height;
public Home home = new Home();
public Person bestFriend;
// constructor with name and height omitted for brevity
}
public class Home {
public Address address = new Address();
}
public static class Address {
public int number = 1;
}
Person jack = new Person("Jack", 1.80);
jack.home.address.number = 123;
Person jackClone = new Person("Jack", 1.80);
jackClone.home.address.number = 123;
// cycle are handled in comparison
jack.bestFriend = jackClone;
jackClone.bestFriend = jack;
// will fail as equals compares object references
assertThat(jack).isEqualTo(jackClone);
// jack and jackClone are equals when doing a recursive field by field comparison
assertThat(jack).isEqualToComparingFieldByFieldRecursively(jackClone);
// any type/field can be compared with a a specific comparator.
// let's change jack's height a little bit
jack.height = 1.81;
// assertion fails because of the height difference
// (the default precision comparison for double is 1.0E-15)
assertThat(jack).isEqualToComparingFieldByFieldRecursively(jackClone);
// this succeeds because we allow a 0.5 tolerance on double
assertThat(jack).usingComparatorForType(new DoubleComparator(0.5), Double.class)
.isEqualToComparingFieldByFieldRecursively(jackClone);
// you can set a comparator on specific fields (nested fields are supported)
assertThat(jack).usingComparatorForFields(new DoubleComparator(0.5), "height")
.isEqualToComparingFieldByFieldRecursively(jackClone);
other
- the object to compare actual
to.this
assertion object.AssertionError
- if the actual object is null
.AssertionError
- if the actual and the given objects are not deeply equal property/field by property/field.IntrospectionError
- if one property/field to compare can not be found.public <T> SELF returns(T expected, Function<ACTUAL,T> from)
Function
,
a typical usage is to pass a method reference to assert object's property.
Wrapping the given Function
with Assertions.from(Function)
makes the assertion more readable.
Example:
// from is not mandatory but it makes the assertions more readable
assertThat(frodo).returns("Frodo", from(TolkienCharacter::getName))
.returns("Frodo", TolkienCharacter::getName) // no from :(
.returns(HOBBIT, from(TolkienCharacter::getRace));
T
- the expected value type the given method
returns.expected
- the value the object under test method's call should return.from
- Function
used to acquire the value to test from the object under test. Must not be null
this
assertion object.NullPointerException
- if given from
function is nullpublic RecursiveComparisonAssert<?> usingRecursiveComparison()
isEqualTo
assertion.
Example:
public class Person {
String name;
double height;
Home home = new Home();
}
public class Home {
Address address = new Address();
Date ownedSince;
}
public static class Address {
int number;
String street;
}
Person sherlock = new Person("Sherlock", 1.80);
sherlock.home.ownedSince = new Date(123);
sherlock.home.address.street = "Baker Street";
sherlock.home.address.number = 221;
Person sherlock2 = new Person("Sherlock", 1.80);
sherlock2.home.ownedSince = new Date(123);
sherlock2.home.address.street = "Baker Street";
sherlock2.home.address.number = 221;
// assertion succeeds as the data of both objects are the same.
assertThat(sherlock).usingRecursiveComparison()
.isEqualTo(sherlock2);
// assertion fails because sherlock.equals(sherlock2) is false.
assertThat(sherlock).isEqualTo(sherlock2);
The recursive comparison is performed according to the default RecursiveComparisonConfiguration
that is:
withStrictTypeChecking()
to change that behavior). usingComparatorForType(Comparator, Class)
RecursiveComparisonAssert
instancepublic RecursiveComparisonAssert<?> usingRecursiveComparison(RecursiveComparisonConfiguration recursiveComparisonConfiguration)
usingRecursiveComparison()
but allows to specify your own RecursiveComparisonConfiguration
.recursiveComparisonConfiguration
- the RecursiveComparisonConfiguration
used in the chained isEqualTo
assertion.RecursiveComparisonAssert
instance built with the given RecursiveComparisonConfiguration
.protected AbstractObjectAssert<?,?> newObjectAssert(Object objectUnderTest)
Copyright © 2014–2019 AssertJ. All rights reserved.