Master the most popular testing framework for Java, through the Learn JUnit course:
Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.
Get started with mocking and improve your application tests using our Mockito guide:
Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.
Get started with understanding multi-threaded applications with our Java Concurrency guide:
Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:
Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.
But these can also be overused and fall into some common pitfalls.
To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:
Get started with Spring and Spring Boot, through the Learn Spring course:
>> LEARN SPRINGExplore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:
Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.
I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.
You can explore the course here:
Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.
Get started with Spring Data JPA through the guided reference course:
Refactor Java code safely β and automatically β with OpenRewrite.
Refactoring big codebases by hand is slow, risky, and easy to put off. Thatβs where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.
Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions β one for newcomers and one for experienced users. Youβll see how recipes work, how to apply them across projects, and how to modernize code with confidence.
Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.
1. Overview
In this article, weβll make a quick review of JUnitβs @Test annotation. This annotation provides a powerful tool for performing unit and regression testing.
2. Maven Configuration
To use the latest version of JUnit 5, weβll need to add the following Maven dependency:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.11.0-M2</version>
<scope>test</scope>
</dependency>
We use the test scope because we donβt want Maven to include this dependency in our final build.
Since the surefire plugin doesnβt still natively fully support JUnit 5, weβll also need to add a provider, which tells Maven where to find our tests:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
</plugin>
In our configuration, weβll use surefire 2.19.1 because, at the time of writing, version 2.20.x is not compatible with the junit-platform-surefire-provider.
3. Method Under Test
First of all, letβs build a simple method that weβll use in our test scenarios to showcase the @Test annotationβs capabilities:
public boolean isNumberEven(Integer number) {
return number % 2 == 0;
}
This method should return true if the argument passed is an even number and false otherwise. Now, letβs check out if it works the way itβs supposed to.
4. Testing the Method
For our example, we want to specifically check two scenarios:
- when given an even number, the method should return true
- when given an odd number, the method should return false
This means that the implementation code will call our isNumberEven method with different parameters and check that the result is what we expect.
In order for the tests to be recognized as such, weβll add the @Test annotation. We can have as many of these as we want in a class, but itβs a good practice to put together only the related ones. Notice also that a test must not be private, nor may it return a value βotherwise itβll just be ignored.
Given these considerations, letβs write our test methods:
@Test
void givenEvenNumber_whenCheckingIsNumberEven_thenTrue() {
boolean result = bean.isNumberEven(8);
Assertions.assertTrue(result);
}
@Test
void givenOddNumber_whenCheckingIsNumberEven_thenFalse() {
boolean result = bean.isNumberEven(3);
Assertions.assertFalse(result);
}
If we now run a Maven build, the surefire plugin will go through all the annotated methods in the classes placed under src/test/java and execute them, causing the build to fail if any test failures occur.
If you come from JUnit 4, be aware that in this version the annotation doesnβt accept any parameters. To check for a timeout or an exception thrown we would use assertions instead:
@Test
void givenLowerThanTenNumber_whenCheckingIsNumberEven_thenResultUnderTenMillis() {
Assertions.assertTimeout(Duration.ofMillis(10), () -> bean.isNumberEven(3));
}
@Test
void givenNull_whenCheckingIsNumberEven_thenNullPointerException() {
Assertions.assertThrows(NullPointerException.class, () -> bean.isNumberEven(null));
}
5. Conclusion
In this quick tutorial, we showed how to implement and run a simple JUnit test with the @Test annotation.
More about the JUnit framework can be found in this post which provides a general introduction.
