https://github.com/shazam/shazamcrest
Reusable Hamcrest matchers suitable for automated testing
https://github.com/shazam/shazamcrest
Last synced: 3 months ago
JSON representation
Reusable Hamcrest matchers suitable for automated testing
- Host: GitHub
- URL: https://github.com/shazam/shazamcrest
- Owner: shazam
- License: other
- Created: 2013-03-18T10:32:33.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2022-06-24T14:48:46.000Z (about 4 years ago)
- Last Synced: 2025-12-21T04:25:35.351Z (7 months ago)
- Language: Java
- Size: 192 KB
- Stars: 95
- Watchers: 26
- Forks: 36
- Open Issues: 17
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-java - Shazamcrest
README
Shazamcrest
===========
'Shazamcrest' is a library that extends the functionality of [hamcrest](http://hamcrest.org/).
Assertions on complete beans are made simpler by serialising the actual and expected beans to json, and comparing
the two. The diagnostics are leveraging the comparison functionality of IDEs like Eclipse or IntelliJ.
Usage
-----
Having a Person bean with the following structure:
Person person
|-- String name
|-- String surname
|-- Address address
|-- String streetName
|-- int streetNumber
|-- String postcode
to compare two Person beans with Shazamcrest we would write:
assertThat(actualPerson, sameBeanAs(expectedPerson));
instead of explicitly match every field of the bean and sub-beans:
assertThat(actualPerson, allOf(
hasProperty("name", equalTo(expectedPerson.name)),
hasProperty("surname", equalTo(expectedPerson.surname)),
hasProperty("address", allOf(
hasProperty("streetName", equalTo(expectedPerson.address.streetName)),
hasProperty("streetNumber", equalTo(expectedPerson.address.streetNumber)),
hasProperty("postcode", equalTo(expectedPerson.address.postcode)))
)
));
Error Messages
-----
If the person address streetName does not match the expectations, the following diagnostic message is displayed:
org.junit.ComparisonFailure: address.streetName
Expected: Via Roma
got: Via Veneto
expected:<... "streetName": "Via [Roma]",
"streetNumber...> but was:<... "streetName": "Via [Veneto]",
"streetNumber...>
The exception thrown is a ComparisonFailure which can be used by IDEs like Eclipse and IntelliJ to display a visual representation of the differences.

Note: in order to get the ComparisonFailure on mismatch the "assertThat" to use is com.shazam.shazamcrest.MatcherAssert.assertThat
rather than org.hamcrest.MatcherAssert.assertThat
Ignoring fields
-----
If we are not interested in matching the street name, we can ignore it by specifying the field path:
assertThat(actualPerson, sameBeanAs(expectedPerson).ignoring("address.streetName"));
If we want to match the address only by the postcode, we can ignore street name and number by specifying the fields name pattern:
assertThat(actualPerson, sameBeanAs(expectedPerson).ignoring(startsWith("street")));
where startsWith is an Hamcrest matcher.
Custom matching
-----
If we want to make sure that the street name starts with "Via" at least:
assertThat(actualPerson, sameBeanAs(expectedPerson).with("address.streetName"), startsWith("Via"));
Circular references
-----
Having a Shop bean with the following structure:
Shop shop
|-- String name
|-- Store store
|-- Boss boss
|-- Clerk clerk
|-- Store store
|-- Boss boss
Comparing two Shop objects throws a StackOverflowError, because of the cycles Clerk -> Store -> Boss -> Clerk and Clerk -> Boss -> Clerk.
From version 0.10 the circular reference is detected automatically and the serialiser is instructed to serialise the instance once and replace all the other occurrences with a pointer:
assertThat(actualShop, sameBeanAs(expectedShop));
produces the following representation:
{
"store": {
"0x1": {
"0x1": {
"0x1": {
"boss": "0x2"
}
}
},
"0x2": {
"0x1": {
"0x1": {
"clerk": {
"boss": "0x2",
"store": "0x1"
}
}
}
}
},
"name": "shop"
}
QuickStart
-----
To use, [download the zip](https://github.com/shazam/shazamcrest/archive/master.zip) or add the following to your project's pom.xml:
com.shazam
shazamcrest
0.11