JUnit: Nested Annotations
Basics
The basics of the @Nested
annotation are well-covered by Baeldung here: https://www.baeldung.com/junit-5-nested-test-classes
Spring and CS156-specific Notes
For our purposes, nested annotations are useful when attempting to test a class that requires multiple different configuration annotations to test fully.
For example, if I had a class that had a different Bean
for two separate profiles, I could test it in one file like so:
public class EnclosingClass{
@ActiveProfiles("development")
@Nested
class SubclassOne{
test_in_development()
}
@ActiveProfiles("production")
@Nested
class SubClassTwo{
test_in_production()
}
}
This allows us to keep the number of files down, while still fully testing classes.
Another time it may be important to use @Nested
is when attempting to test custom Spring Security annotations. Spring Security is loaded prior to the test, so if you need to insert a MockitoBean
into it, you must do so in an @Before
. Without Nested annotations, you’d need a number of classes to test this.
With @Nested
, you can set up subclasses, each with their on @Before
.
If testing Spring Security, the annotations @NestedTestConfiguration(NestedTestConfiguration.EnclosingConfiguration.INHERIT)
(inherit the parent class’s annotations) and setupBefore = TestExecutionEvent.TEST_EXECUTION
as a property of MockUser (load Spring Security after the @Before
runs so the MockitoBeans stick) may make testing easier.