-
Notifications
You must be signed in to change notification settings - Fork 0
/
CustomAssertionsTest.java
95 lines (82 loc) · 4.82 KB
/
CustomAssertionsTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package assertj;
import assertj.custom.CustomAssertWrapper;
import assertj.custom.CustomIgnoringIntrospectionStrategy;
import assertj.custom.CustomRecursiveAssert;
import org.assertj.core.api.Assertions;
import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration;
import org.junit.jupiter.api.Test;
public class CustomAssertionsTest extends MyBaseTest {
@Test
public void thisIsItTest() {
//a lot of hoops and dupes for very simple things, but it works.
CustomAssertWrapper.verifyEquals(actualList, expectedList);
//Result looks like:
//java.lang.AssertionError:
//Equals mismatch for <User> in <ArrayList>:
//Found 5 differences:
//
//field/property '[0].addresses' differ:
//- actual value : [Address(country=UK, city=London, street=Baker st., building=221B),
// Address(country=UK, city=London, street=Baker st., building=221C),
// Address(country=UK, city=London, street=Baker st., building=221D)]
//- expected value: null
//
//field/property '[1].addresses' differ:
//- actual value : null
//- expected value: [Address(country=UK, city=Manchester, street=Baker st., building=221B),
// Address(country=UK, city=Manchester, street=Baker st., building=221C)]
//
//field/property '[2].addresses' differ:
//- actual value : [Address(country=UK, city=London, street=Baker st., building=221B),
// Address(country=UK, city=London, street=Baker st., building=221C),
// Address(country=UK, city=London, street=Baker st., building=221D)]
//- expected value: [Address(country=UK, city=Manchester, street=Baker st., building=221B),
// Address(country=UK, city=Manchester, street=Baker st., building=221C)]
//actual and expected values are collections of different size, actual size=3 when expected size=2
//
//field/property '[3].addresses[0].city' differ:
//- actual value : "London"
//- expected value: "Manchester"
//
//field/property '[3].addresses[1].city' differ:
//- actual value : "London"
//- expected value: "Manchester"
}
@Test
public void recursiveComparisonWithCustomEqualsTest() {
// custom introspection strategy solves equals problem AND assertion text string problem!!
// another option would be to use conditions / verbose conditions, as seen in https://policyexpert-engineering.co.uk/precise-and-readable-assertions-with-assertj-ce50402d6dcb
// now we only need to find how to reformat default message
// and test for difference in amount of data
Assertions.assertThat(actualList)
.usingRecursiveComparison()
.withIntrospectionStrategy(new CustomIgnoringIntrospectionStrategy()) //ignores names of User
//.overridingErrorMessage() <- solves custom message but results in a lot of duplication
//.withRepresentation() // <- custom tostring for objects for actual/expected diff
//.usingOverriddenEquals() // <- solved by introspection strategy
//.describedAs() // <- can add custom message before main assertion content
.isEqualTo(expectedList);
}
@Test
//this is ass indeed, not useful
public void customRecursiveAssertTest() {
//should solve custom assertion text problem -
// we need to be able to exclude fields that we don't compare
// from assertion text string
// same as //.usingRecursiveComparison()
CustomRecursiveAssert ass = new CustomRecursiveAssert<>(actualList, new RecursiveComparisonConfiguration());
// Assertions.assertThat(actualList.get(0))
ass
.usingRecursiveComparison1()
//.usingComparator(new RecursiveComparator(new RecursiveComparisonConfiguration()))
//TODO custom formatting for deep equals regardless of overridden equals! need to find the entrypoint for formatter
//.usingOverriddenEquals() // useless since output doesn't reflect individual fields
// either use overridden or below logic
//TODO replace with getter of fieldslist; implement methods to recursively collect all ignored fields in proper format like "owners.dataEntryDate"!
.ignoringFields("created_date", "modified_date", "version") //top level only for now
.ignoringFieldsMatchingRegexes(".*LOG") //class type doesn't work -> no getter; either remove static logger or keep this filter
.ignoringCollectionOrder() //you must have everything as lists, but they can be in any order as long as objects match 1-to-1?
//.isEqualTo(expectedList.get(0);
.customTextIsEqualTo(expectedList);
}
}