Simplify JUnit tests with custom annotations
In the beginning was a test, that provided to be vital, but not sufficient. In modern application development we encounter:
- Unit Tests: testing a single function or a tuple of related functions
- Module Tests: testing bigger parts of your application, without actual external dependencies
- Integration or End-to-End tests: a.k.a life firing exercise
This entry isn't a discussion about the merits of how much and when test, but making tests easy to setup and distinguish
The manual way
We typically use Mockito, vert.x and REST-assured in our tests, so a typical test class would look like this:
@ExtendWith(VertxExtension.class, MockitoExtension.class, MyCustomExtension.class})
@Tag("UnitTest")
class SomethingTest {
@Test
does_it_blend() {
// Test goes here
}
}
It is just two lines, but everywhere. You can simplify it by creating your own annotation.
The custom annotation
@Target({TYPE, METHOD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@ExtendWith({VertxExtension.class, MockitoExtension.class, MyCustomExtension.class})
@Tag("UnitTest")
public @interface UnitTest {
// no action needed here, JUnit use only!
}
Now you simply use:
@UnitTest
class SomethingTest {
@Test
does_it_blend() {
// Test goes here
}
}
While this looks like minor cosmetic, it allows to control test extensions from a single place, your annotation source. Repeat that process for the other test types (ModuleTests, IntegrationTests, PerformanceTests etc.) you want to use.
In your pom.xml, in the build-plugins section you can use the tag to ensure all your unit test, but only them execute on mvn test
and the others on mvn verify
<plugin>
<!-- Run UNIT and MODULE tests, no backend calls -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<groups>UnitTest,ModuleTest</groups>
</configuration>
</plugin>
As usual YMMV
Posted by Stephan H Wissel on 05 August 2024 | Comments (0) | categories: Java jUnit Maven TDD