JUnit 5 Testing Skill
Expert JUnit 5 tests generated in seconds, not hours
❌ Java developers spend hours writing boilerplate test code and struggle with proper JUnit 5 patterns, mocking strategies, and test organization.
✅ You get production-grade, maintainable JUnit 5 tests with proper assertions, mocking, parameterization, and lifecycle management ready to use immediately.
- ✓Standard unit tests with fluent assertions and best practices
- ✓Parameterized tests for multiple input scenarios
- ✓Mockito mocking for external dependencies
- ✓Nested tests with @Nested for organized test structures
- ✓Lifecycle hooks and test fixtures with @BeforeEach and @AfterEach
👁 1 views · 📦 0 installs
Free to install — no account needed
Copy the command below and paste into your agent.
Instant access • No coding needed • No account needed
What you get in 5 minutes
- Full skill code ready to install
- Works with 4 AI agents
- Lifetime updates included
Run this helper
Answer a few questions and let this helper do the work.
▸Advanced: use with your AI agent
Description
--- name: junit-5-skill description: > Generates production-grade JUnit 5 unit and integration tests in Java. Covers assertions, parameterized tests, lifecycle hooks, mocking with Mockito, and nested tests. Use when user mentions "JUnit", "JUnit 5", "@Test", "assertEquals", "Assertions", "Java unit test". Triggers on: "JUnit", "@Test", "assertEquals", "Java test", "unit test Java". languages: - Java category: unit-testing license: MIT metadata: author: TestMu AI version: "1.0" --- # JUnit 5 Testing Skill You are a senior Java developer specializing in JUnit 5 testing. ## Step 1 — Test Type ``` ├─ "unit test", "assert" → Standard unit test ├─ "parameterized", "multiple inputs" → @ParameterizedTest ├─ "mock", "Mockito" → Unit test with Mockito ├─ "integration test", "Spring" → Read reference/spring-integration.md └─ Default → Standard unit test ``` ## Core Patterns ### Basic Test ```java import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; class CalculatorTest { private Calculator calculator; @BeforeEach void setUp() { calculator = new Calculator(); } @Test @DisplayName("Addition of two positive numbers") void addPositiveNumbers() { assertEquals(5, calculator.add(2, 3)); } @Test void divideByZero_throwsException() { assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0)); } @Test void multipleAssertions() { assertAll("calculator operations", () -> assertEquals(4, calculator.add(2, 2)), () -> assertEquals(0, calculator.subtract(2, 2)), () -> assertEquals(6, calculator.multiply(2, 3)) ); } } ``` ### Assertions Reference ```java assertEquals(expected, actual); assertNotEquals(unexpected, actual); assertTrue(condition); assertFalse(condition); assertNull(object); assertNotNull(object); assertThrows(IllegalArgumentException.class, () -> service.process(null)); assertTimeout(Duration.ofSeconds(2), () -> service.longRunningOp()); assertAll("group", () -> assertNotNull(user.getName()), () -> assertTrue(user.getAge() > 0) ); assertIterableEquals(List.of(1, 2, 3), actualList); ``` ### Parameterized Tests ```java @ParameterizedTest @ValueSource(strings = {"hello", "world", "junit"}) void stringIsNotEmpty(String value) { assertFalse(value.isEmpty()); } @ParameterizedTest @CsvSource({"1,1,2", "2,3,5", "10,-5,5"}) void addNumbers(int a, int b, int expected) { assertEquals(expected, calculator.add(a, b)); } @ParameterizedTest @MethodSource("provideUsers") void validateUser(String name, int age, boolean expected) { assertEquals(expected, validator.isValid(name, age)); } static Stream<Arguments> provideUsers() { return Stream.of( Arguments.of("Alice", 25, true), Arguments.of("", 25, false), Arguments.of("Bob", -1, false) ); } @ParameterizedTest @NullAndEmptySource @ValueSource(strings = {" ", "\t"}) void blankStringsAreInvalid(String input) { assertFalse(validator.isValid(input)); } ``` ### Mocking with Mockito ```java @ExtendWith(MockitoExtension.class) class UserServiceTest { @Mock private UserRepository userRepo; @Mock private EmailService emailService; @InjectMocks private UserService userService; @Test void createUser_savesAndSendsEmail() { User user = new User("[email protected]", "Alice"); when(userRepo.save(any(User.class))).thenReturn(user); User result = userService.createUser("[email protected]", "Alice"); assertNotNull(result); verify(userRepo).save(any(User.class)); verify(emailService).sendWelcomeEmail("[email protected]"); } @Test void getUser_notFound_throwsException() { when(userRepo.findById(99L)).thenReturn(Optional.empty()); assertThrows(UserNotFoundException.class, () -> userService.getUser(99L)); } } ``` ### Nested Tests ```java @DisplayName("UserService") class UserServiceTest { @Nested @DisplayName("when creating a user") class CreateUser { @Test void withValidData_succeeds() { } @Test void withDuplicateEmail_throwsException() { } } @Nested @DisplayName("when deleting a user") class DeleteUser { @Test void existingUser_removesFromDb() { } @Test void nonExistentUser_throwsException() { } } } ``` ### Anti-Patterns | Bad | Good | Why | |-----|------|-----| | `@Test public void test1()` | `@Test void shouldCalculateSum()` | Descriptive names | | Testing private methods | Test via public API | Implementation detail | | No @DisplayName | Always add display names | Better reporting | | `assertEquals(true, x)` | `assertTrue(x)` | More readable | ## Maven Dependencies ```xml <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>5.14.0</version> <scope>test</scope> </dependency> ``` ## Quick Reference | Task | Command | |------|---------| | Run all | `mvn test` or `./gradlew test` | | Run class | `mvn test -Dtest=UserServiceTest` | | Run method | `mvn test -Dtest=UserServiceTest#createUser_succeeds` | | Run tagged | `@Tag("slow")` + `mvn test -Dgroups="slow"` | | Disable | `@Disabled("Reason")` | | Conditional | `@EnabledOnOs(OS.LINUX)` | | Timeout | `@Timeout(value = 5, unit = TimeUnit.SECONDS)` | | Repeated | `@RepeatedTest(5)` | | Order | `@TestMethodOrder(MethodOrderer.OrderAnnotation.class)` | ## Deep Patterns For production-grade patterns, see `reference/playbook.md`: | Section | What's Inside | |---------|--------------| | §1 Project Setup | Maven deps, parallel config, surefire | | §2 Test Lifecycle | BeforeAll/Each, ordering, tags | | §3 Parameterized | CsvSource, MethodSource, EnumSource, ValueSource | | §4 Mockito | @Mock/@InjectMocks, captor, verify order | | §5 Nested & Dynamic | @Nested grouping, @TestFactory | | §6 AssertJ | Fluent assertions, extracting, collection checks | | §7 Conditional | @EnabledOnOs, assumptions, @EnabledIf | | §8 Custom Extensions | Timing, retry, BeforeTestExecution | | §9 CI/CD | GitHub Actions with test reporter | | §10 Debugging Table | 8 common problems with fixes | | §11 Best Practices | 12-item production checklist |
Security Status
Scanned
Passed automated security checks
Related AI Tools
More Career Boost tools you might like
ru-text — Russian Text Quality
FreeApplies professional Russian typography, grammar, and style rules to improve text quality across content types
/forge:工作流总入口
Free'Forge 工作流总入口。检查项目状态,推荐下一步该用哪个 skill。任何时候不知道下一步该干什么,就用 /forge。触发方式:用户说"forge"、"下一步"、"接下来做什么"、"继续"(在没有明确上下文时)。'
TypeScript React & Next.js Production Patterns
FreeProduction-grade TypeScript reference for React & Next.js covering type safety, component patterns, API validation, state management, and debugging
Charles Proxy Session Extractor
FreeExtracts HTTP/HTTPS request and response data from Charles Proxy session files (.chlsj format), including URLs, methods, status codes, headers, request bodies, and response bodies. Use when analyzing captured network traffic from Charles Proxy debug
Java Backend Interview Simulator
FreeSimulates realistic Java backend technical interviews with customizable interviewer styles and candidate levels for Chinese tech companies
AI News & Trends Intelligence
FreeFetches latest AI/ML news, trending open-source projects, and social media discussions from 75+ curated sources for comprehensive AI briefings