How to use Hamcrest for testing
? Sometime back I’ve written a Hello World JUnit Article with all details. In this tutorial we will go over steps on how to use Hamcrest to create JUnit
for your Java project.
Hamcrest is a testing framework
for Java with matchers bundled with the JUnit framework to create more readable Java unit tests. I tried it today and I absolutely love it. Very simple and complete documentation makes it perfect.
If you have any of below questions then you are at right place:
- Writing JUnit test cases in Java using Eclipse
- How to write junit test cases in Java
- Sample JUnit test cases in Java
- Writing JUnit test cases using
Hamcrest Matchers
- The Benefits of
assertThat vs Assert
Methods in JUnit Tests - hamcrest
assertthat()
tutorial
Let’s get started:
Create Java class CrunchifyHemcrestJUnitTest.java
in Eclipse. We are going to create 4 different category of tests.
- Create JUnit testcases for
Java List
- Create JUnit testcases for Java Map
- Create JUnit testcases for Java Object
- Create JUnit testcases for Null Check
Here are the top Hamcrest matchers:
- is()
- hasItems()
- hasSize()
- contains()
- containsInAnyOrder()
Below tutorial covers almost all matchers testcases which will pass all the time. Just modify to create false positive and so on.
You need to add below maven dependency in your project.
1 2 3 4 5 |
<dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> </dependency> |
Just add this to pom.xml
file. If you don’t see pom.xml then follow this tutorial.
Here is a complete Java code
Just right click on a class and Run As
-> JUnit Test
.
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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
package crunchify.com.tutorial; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasProperty; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import org.hamcrest.collection.IsEmptyCollection; import org.hamcrest.collection.IsMapContaining; import org.hamcrest.core.IsNull; import org.junit.Test; /** * @author Crunchify.com * * Hamcrest JUnit Tutorials by Crunchify.com * 1. Create JUnit testcases for Java List * 2. Create JUnit testcases for Java Map * 3. Create JUnit testcases for Java Object * 4. Create JUnit testcases for Null Check * */ public class CrunchifyHamcrestJUnitTest { // Testcase-1: JUnit for List @Test public void crunchifyListJUnitTests() { List<String> company = Arrays.asList("Crunchify.com", "Google.com", "Facebook.com"); List<String> crunchifyCompany = Arrays.asList("Crunchify.com", "Google.com", "Facebook.com"); log("\n~~~~~~~~~~~JUnit List Check Test~~~~~~~~~~~"); log("1) assertThat(company, is(crunchifyCompany)) check"); // A shortcut to the frequently used is(equalTo(x)). assertThat(company, is(crunchifyCompany)); log("2) .hasItems() check"); assertThat(company, hasItems("Crunchify.com")); log("3) .hasSize() check"); assertThat(company, hasSize(3)); assertThat(company.size(), is(3)); log("4) .contains() and .containsInAnyOrder() check"); assertThat(company, contains("Crunchify.com", "Google.com", "Facebook.com")); assertThat(company, containsInAnyOrder("Google.com", "Crunchify.com", "Facebook.com")); // FAIL // assertThat(company, contains("Google.com", "Crunchify.com", "Facebook.com")); log("5) .empty() check"); assertThat(company, not(IsEmptyCollection.empty())); assertThat(new ArrayList<>(), IsEmptyCollection.empty()); } private void log(String crunchifyText) { System.out.println(crunchifyText); } @Test public void crunchifyMapJUnitTests() { Map<String, String> company = new HashMap<>(); company.put("C", "Crunchify.com"); company.put("G", "Google.com"); company.put("F", "Facebook.com"); Map<String, String> crunchifyCompany = new HashMap<>(); crunchifyCompany.put("C", "Crunchify.com"); crunchifyCompany.put("G", "Google.com"); crunchifyCompany.put("F", "Facebook.com"); log("\n~~~~~~~~~~~JUnit Map Check Test - All tests will PASS in our example~~~~~~~~~~~"); log("1) assertThat(company, is(crunchifyCompany) check"); assertThat(company, is(crunchifyCompany)); log("2) assertThat(company.size(), is(3)) check"); assertThat(company.size(), is(3)); log("3) .hasEntry() check which creates a matcher for Maps matching at least one entry whose key equals the specified key & value."); assertThat(company, IsMapContaining.hasEntry("C", "Crunchify.com")); assertThat(company, not(IsMapContaining.hasEntry("G", "Twitter.com"))); log("4) .hasKey() creates a matcher for Maps matching at least one key that is equal to the specified key."); assertThat(company, IsMapContaining.hasKey("F")); log("5) .hasValue() creates a matcher for Maps matching at least one key that is equal to the specified value."); assertThat(company, IsMapContaining.hasValue("Crunchify.com")); } @SuppressWarnings("unchecked") @Test public void crunchifyObjectJUnitTests() { List<Company> list = Arrays.asList(new Company("Crunchify", 10), new Company("Google", 30000)); assertThat(list, hasItems(new Company("Crunchify", 10), new Company("Google", 30000))); assertThat(list, containsInAnyOrder(new Company("Google", 30000), new Company("Crunchify", 10))); assertThat(list, containsInAnyOrder(hasProperty("name", is("Google")), hasProperty("name", is("Crunchify")))); log("\n~~~~~~~~~~~JUnit Object Check Test Completed~~~~~~~~~~~"); } // Create Company Object public class Company { public Company(String name, int employeeCount) { this.name = name; this.employeeCount = employeeCount; } private String name; private int employeeCount; public int getEmployeeCount() { return employeeCount; } public void setEmployeeCount(int employeeCount) { this.employeeCount = employeeCount; } public String getName() { return name; } public void setName(String name) { this.name = name; } // Test equal, override equals() and hashCode() @Override public boolean equals(Object c) { if (this == c) return true; if (c == null || getClass() != c.getClass()) return false; Company fruit = (Company) c; return employeeCount == fruit.employeeCount && Objects.equals(name, fruit.name); } @Override public int hashCode() { return Objects.hash(name, employeeCount); } } @Test public void crunchifyNullCheckJUnitTest() { // Two ways to check isNull assertThat(null, is(nullValue())); assertThat(null, is(IsNull.nullValue())); // Two ways to check isNotNull assertThat("crunchify", is(notNullValue())); assertThat("crunchify", is(IsNull.notNullValue())); log("\n~~~~~~~~~~~JUnit Null Check Test Completed~~~~~~~~~~~"); } } |
Eclipse console output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
~~~~~~~~~~~JUnit Object Check Test Completed~~~~~~~~~~~ ~~~~~~~~~~~JUnit Null Check Test Completed~~~~~~~~~~~ ~~~~~~~~~~~JUnit List Check Test~~~~~~~~~~~ 1) assertThat(company, is(crunchifyCompany)) check 2) .hasItems() check 3) .hasSize() check 4) .contains() and .containsInAnyOrder() check 5) .empty() check ~~~~~~~~~~~JUnit Map Check Test - All tests will PASS in our example~~~~~~~~~~~ 1) assertThat(company, is(crunchifyCompany) check 2) assertThat(company.size(), is(3)) check 3) .hasEntry() check which creates a matcher for Maps matching at least one entry whose key equals the specified key & value. 4) .hasKey() creates a matcher for Maps matching at least one key that is equal to the specified key. 5) .hasValue() creates a matcher for Maps matching at least one key that is equal to the specified value. |