Writes and improves JUnit 5 unit tests for Java projects. Use when asked to create unit tests, write parameterized/data-driven tests, improve test coverage, set up mocking with Mockito, or follow testing best practices with JUnit Jupiter. Covers test structure, assertions, @ParameterizedTest, @ValueSource, @CsvSource, and @MethodSource.
Writes and improves JUnit 5 unit tests for Java projects. Use when asked to create unit tests, write parameterized/data-driven tests, improve test coverage, set up mocking with Mockito, or follow testing best practices with JUnit Jupiter. Covers test structure, assertions, @ParameterizedTest, @ValueSource, @CsvSource, and @MethodSource.
JUnit 5+ Best Practices
Project Setup
Use a standard Maven or Gradle project structure.
Place test source code in src/test/java.
Include dependencies for junit-jupiter-api, junit-jupiter-engine, and junit-jupiter-params for parameterized tests.
Use build tool commands to run tests: mvn test or gradle test.
Test Structure
Test classes should have a Test suffix, e.g., CalculatorTest for a Calculator class.
Use @Test for test methods.
Follow the Arrange-Act-Assert (AAA) pattern.
Name tests using a descriptive convention, like methodName_should_expectedBehavior_when_scenario.
Use @BeforeEach and @AfterEach for per-test setup and teardown.
Use @BeforeAll and @AfterAll for per-class setup and teardown (must be static methods).
Use @DisplayName to provide a human-readable name for test classes and methods.
Standard Tests
Test one logical condition per method, keeping each test focused on a single behavior.
Make tests independent and idempotent: no shared mutable state, no ordering assumptions, runnable in any order.
Data-Driven (Parameterized) Tests
Use @ParameterizedTest to mark a method as a parameterized test.
Use @ValueSource for simple literal values (strings, ints, etc.).
Use @MethodSource to refer to a factory method that provides test arguments as a Stream, Collection, etc.
Use @CsvSource for inline comma-separated values.
Use @CsvFileSource to use a CSV file from the classpath.
Use @EnumSource to use enum constants.
Assertions
Use org.junit.jupiter.api.Assertions or AssertJ for more fluent assertions.
Use assertThrows / assertDoesNotThrow for exception testing.
Group related assertions with assertAll.
Mocking and Isolation
Use a mocking framework like Mockito to create mock objects for dependencies.
Use @Mock and @InjectMocks annotations from Mockito to simplify mock creation and injection.
Use interfaces to facilitate mocking.
Test Organization
Group tests by feature or component using packages.
Use @Tag to categorize tests (e.g., @Tag("fast"), @Tag("integration")).
Use @TestMethodOrder(MethodOrderer.OrderAnnotation.class) and @Order to control test execution order when strictly necessary.
Use @Disabled to temporarily skip a test method or class, providing a reason.
Use @Nested to group tests in a nested inner class for better organization and structure.