Organize Tests - anastasiamexa/Healthy-Coder-App GitHub Wiki
In JUnit 5, the @Nested
annotation allows you to group and nest test classes within another test class. This is especially useful when you want to organize your tests in a hierarchical structure and share setup and cleanup code among related tests.
Here's a basic example to illustrate how @Nested
can be used:
import org.junit.jupiter.api.*;
class OuterTestClass {
@BeforeEach
void setUp() {
// Common setup code for all tests in OuterTestClass
}
@AfterEach
void tearDown() {
// Common cleanup code for all tests in OuterTestClass
}
@Test
void test1() {
// Test logic for test1
}
@Nested
class InnerTestClass {
@BeforeEach
void setUp() {
// Setup code specific to tests in InnerTestClass
}
@AfterEach
void tearDown() {
// Cleanup code specific to tests in InnerTestClass
}
@Test
void test2() {
// Test logic for test2
}
@Test
void test3() {
// Test logic for test3
}
}
}
In this example:
OuterTestClass
contains two tests (test1
) and a nested test class InnerTestClass.InnerTestClass
also has its own setup, cleanup, and two tests (test2
andtest3
). When you run the tests, JUnit will execute the setup and cleanup methods in the correct order, both at the outer level and within the nested class. This allows you to organize your tests in a more modular and hierarchical manner.
Some key points about @Nested
:
- Encapsulation: Nested classes can encapsulate related tests and provide a clear structure.
- Sharing Setup/Cleanup Code: You can have setup and cleanup methods specific to the outer class and others specific to the nested class, allowing for more granular control.
- Hierarchy in Test Results: The test results will reflect the hierarchy, making it easier to understand which tests are part of a nested structure.
- Lifecycle Independence: Each nested class has its own lifecycle, so setup and cleanup methods are executed independently for each level.
Using @Nested
is particularly beneficial when you have a set of tests that share some common setup and cleanup procedures but also have specific requirements or dependencies within certain subsets of the tests. It helps to improve the readability and maintainability of your test suite.