🎓 Top 15 Udemy Courses (80-90% Discount): My Udemy Courses - Ramesh Fadatare — All my Udemy courses are real-time and project oriented courses.
▶️ Subscribe to My YouTube Channel (178K+ subscribers): Java Guides on YouTube
▶️ For AI, ChatGPT, Web, Tech, and Generative AI, subscribe to another channel: Ramesh Fadatare on YouTube
Introduction
Hamcrest is a powerful library for writing matcher objects that can be used for making assertions in tests. It is commonly used with testing frameworks like JUnit to improve the readability and maintainability of test cases. This guide will cover the installation, basic usage, advanced features, and various use cases of Hamcrest using the latest version.
Installation
Adding Hamcrest to Your Project
To use Hamcrest, add the following dependency to your pom.xml if you're using Maven:
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>2.2</version> <!-- or the latest version -->
<scope>test</scope>
</dependency>
For Gradle:
testImplementation 'org.hamcrest:hamcrest:2.2'
Getting Started with Hamcrest
Basic Matchers
Hamcrest provides a variety of matchers that can be used to write expressive tests.
Using assertThat
The assertThat method is used to make assertions using Hamcrest matchers.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class BasicMatchersExample {
public static void main(String[] args) {
String name = "Amit";
assertThat(name, is("Amit"));
assertThat(name, not("Vikas"));
assertThat(name, containsString("mit"));
}
}
Explanation: This example checks that the string name is equal to "Amit", not equal to "Vikas", and contains the substring "mit".
Output:
No output if assertions pass.
Core Matchers
is Matcher
The is matcher is a wrapper to improve readability.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class IsMatcherExample {
public static void main(String[] args) {
int age = 25;
assertThat(age, is(25));
}
}
Explanation: This example checks that the integer age is equal to 25.
Output:
No output if assertions pass.
equalTo Matcher
The equalTo matcher checks for object equality.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class EqualToMatcherExample {
public static void main(String[] args) {
String city = "Mumbai";
assertThat(city, equalTo("Mumbai"));
}
}
Explanation: This example checks that the string city is equal to "Mumbai".
Output:
No output if assertions pass.
not Matcher
The not matcher inverts the result of another matcher.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class NotMatcherExample {
public static void main(String[] args) {
String name = "Rajesh";
assertThat(name, is(not("Suresh")));
}
}
Explanation: This example checks that the string name is not equal to "Suresh".
Output:
No output if assertions pass.
containsString Matcher
The containsString matcher checks if a string contains a specific substring.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class ContainsStringMatcherExample {
public static void main(String[] args) {
String message = "Hello, Priya!";
assertThat(message, containsString("Priya"));
}
}
Explanation: This example checks that the string message contains the substring "Priya".
Output:
No output if assertions pass.
Advanced Matchers
Collection Matchers
Hamcrest provides several matchers to work with collections.
hasItem Matcher
The hasItem matcher checks if a collection contains a specific item.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import java.util.Arrays;
import java.util.List;
public class HasItemMatcherExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Amit", "Rajesh", "Priya");
assertThat(names, hasItem("Priya"));
}
}
Explanation: This example checks that the list names contains the item "Priya".
Output:
No output if assertions pass.
hasItems Matcher
The hasItems matcher checks if a collection contains multiple specific items.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import java.util.Arrays;
import java.util.List;
public class HasItemsMatcherExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Amit", "Rajesh", "Priya");
assertThat(names, hasItems("Amit", "Priya"));
}
}
Explanation: This example checks that the list names contains both "Amit" and "Priya".
Output:
No output if assertions pass.
everyItem Matcher
The everyItem matcher checks if every item in a collection matches a specific condition.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import java.util.Arrays;
import java.util.List;
public class EveryItemMatcherExample {
public static void main(String[] args) {
List<Integer> ages = Arrays.asList(20, 25, 30);
assertThat(ages, everyItem(greaterThan(18)));
}
}
Explanation: This example checks that every item in the list ages is greater than 18.
Output:
No output if assertions pass.
Custom Matchers
Hamcrest allows you to create custom matchers to suit your specific needs.
import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
public class IsPositiveInteger extends TypeSafeMatcher<Integer> {
@Override
protected boolean matchesSafely(Integer number) {
return number > 0;
}
@Override
public void describeTo(Description description) {
description.appendText("a positive integer");
}
public static IsPositiveInteger isPositiveInteger() {
return new IsPositiveInteger();
}
}
Explanation: This custom matcher IsPositiveInteger checks if an integer is positive.
Using the Custom Matcher
import static org.hamcrest.MatcherAssert.assertThat;
public class CustomMatcherExample {
public static void main(String[] args) {
int number = 10;
assertThat(number, IsPositiveInteger.isPositiveInteger());
}
}
Explanation: This example checks that the integer number is positive using the custom matcher IsPositiveInteger.
Output:
No output if assertions pass.
Logical Matchers
allOf Matcher
The allOf matcher checks if all conditions are met.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class AllOfMatcherExample {
public static void main(String[] args) {
String name = "Amit Sharma";
assertThat(name, allOf(startsWith("Amit"), containsString("Sharma")));
}
}
Explanation: This example checks that the string name starts with "Amit" and contains "Sharma".
Output:
No output if assertions pass.
anyOf Matcher
The anyOf matcher checks if any of the conditions are met.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class AnyOfMatcherExample {
public static void main(String[] args) {
String name = "Amit Sharma";
assertThat(name, anyOf(startsWith("Amit"), containsString("Kumar")));
}
}
Explanation: This example checks that the string name either starts with "Amit" or contains "Kumar".
Output:
No output if assertions pass.
String Matchers
startsWith Matcher
The startsWith matcher checks if a string starts with a specific prefix.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class StartsWithMatcherExample {
public static void main(String[] args) {
String name = "Suresh Kumar";
assertThat(name, startsWith("Suresh"));
}
}
Explanation: This example checks that the string name starts with "Suresh".
Output:
No output if assertions pass.
endsWith Matcher
The endsWith matcher checks if a string ends with a specific suffix.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class EndsWithMatcherExample {
public static void main(String[] args) {
String name = "Suresh Kumar";
assertThat(name, endsWith("Kumar"));
}
}
Explanation: This example checks that the string name ends with "Kumar".
Output:
No output if assertions pass.
Number Matchers
greaterThan Matcher
The greaterThan matcher checks if a number is greater than a specific value.
import static org.hamcrest.MatcherAssert.assertThat;
import static
org.hamcrest.Matchers.*;
public class GreaterThanMatcherExample {
public static void main(String[] args) {
int age = 30;
assertThat(age, greaterThan(25));
}
}
Explanation: This example checks that the integer age is greater than 25.
Output:
No output if assertions pass.
lessThan Matcher
The lessThan matcher checks if a number is less than a specific value.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class LessThanMatcherExample {
public static void main(String[] args) {
int age = 20;
assertThat(age, lessThan(25));
}
}
Explanation: This example checks that the integer age is less than 25.
Output:
No output if assertions pass.
closeTo Matcher
The closeTo matcher checks if a number is close to a specific value within a certain delta.
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class CloseToMatcherExample {
public static void main(String[] args) {
double value = 19.99;
assertThat(value, closeTo(20.0, 0.1));
}
}
Explanation: This example checks that the double value is close to 20.0 within a delta of 0.1.
Output:
No output if assertions pass.
Conclusion
Hamcrest is a versatile and powerful library for writing expressive and readable assertions in Java. This guide covered the basics of using Hamcrest with various matchers, including core matchers, collection matchers, custom matchers, logical matchers, string matchers, and number matchers. By leveraging Hamcrest, you can improve the readability and maintainability of your test cases. For more detailed information and advanced features, refer to the official Hamcrest documentation.
Comments
Post a Comment
Leave Comment