--- name: junit-integration description: Maven integration testing with Failsafe plugin, IT naming conventions, and profile configuration user-invocable: false allowed-tools: Read, Grep, Glob --- # JUnit Integration Skill **REFERENCE MODE**: This skill provides reference material. Load specific standards on-demand based on current task. Integration testing standards for Maven projects using the Failsafe plugin. This skill covers test separation, naming conventions, and profile configuration. ## Prerequisites This skill applies to Maven projects: - `maven-surefire-plugin` (unit tests) - `maven-failsafe-plugin` (integration tests) ## Key Principles ### Test Separation Integration tests should be completely separated from unit tests to ensure: * Fast unit test execution during regular development builds * Isolated integration test execution that can be run independently * Clear distinction between test types for CI/CD pipelines * Proper resource management for integration tests requiring external dependencies ### Maven Plugin Usage * **Maven Surefire Plugin**: Handles unit tests during the `test` phase * **Maven Failsafe Plugin**: Handles integration tests during the `integration-test` and `verify` phases ## Naming Conventions Integration tests must follow Maven's standard naming conventions: * `**/*IT.java` - Integration Test classes * `**/*ITCase.java` - Alternative integration test naming ```java // ✅ Correct naming public class TokenKeycloakIT extends KeycloakITBase { // Integration test implementation } // ❌ Incorrect naming (would be treated as unit test) public class TokenKeycloakITTest extends KeycloakITBase { // This follows unit test naming convention } ``` ## Maven Configuration ### Base Configuration Configure surefire plugin to exclude integration tests from normal builds: ```xml org.apache.maven.plugins maven-surefire-plugin **/*IT.java **/*ITCase.java ``` ### Integration Test Profile Create a dedicated profile for integration tests: ```xml integration-tests org.apache.maven.plugins maven-surefire-plugin true org.apache.maven.plugins maven-failsafe-plugin **/*IT.java **/*ITCase.java integration-test integration-test verify verify ``` ## Critical Configuration Details ### Why Skip Unit Tests in Integration Profile **Problem**: Without explicit unit test skipping, the integration-tests profile would run: 1. All unit tests (via surefire) 2. All integration tests (via failsafe) **Solution**: Configure surefire to skip tests when the integration-tests profile is active. ### Failsafe Goals Both goals are required for proper integration test execution: * `integration-test`: Runs the integration tests * `verify`: Checks the results and fails the build if tests failed ## Maven Commands ### Normal Development Build ```bash # Runs only unit tests, excludes integration tests ./mvnw clean test # Full build without integration tests ./mvnw clean verify ``` ### Integration Test Execution ```bash # Run only integration tests (skips unit tests) ./mvnw clean verify -Pintegration-tests # Run integration tests for specific modules ./mvnw clean verify -Pintegration-tests -pl module1 ``` ## CI/CD Integration ### GitHub Actions Example ```yaml - name: Run Integration Tests run: ./mvnw --no-transfer-progress clean verify -Pintegration-tests -pl module1,module2 ``` ### Build Verification Ensure both scenarios work correctly: 1. **Normal Build**: Should only run unit tests 2. **Integration Profile**: Should skip unit tests and only run integration tests ## JUnit 5 Nested Tests Integration tests can use JUnit 5 nested test classes. The naming convention applies to the outer class: ```java public class TokenKeycloakIT { @Nested class AccessTokenTests { @Test void shouldValidateAccessToken() { // Test implementation } } @Nested class IdTokenTests { @Test void shouldValidateIdToken() { // Test implementation } } } ``` ## Common Pitfalls ### ❌ Incorrect Naming Convention ```java // Wrong - will be treated as unit test public class TokenKeycloakITTest { } ``` ### ❌ Missing Surefire Skip Configuration Without `true` in the integration-tests profile, both unit and integration tests will run. ### ❌ Wrong Maven Goal ```bash # Wrong - only compiles and runs surefire (unit tests) mvn clean test -Pintegration-tests # Correct - runs full lifecycle including failsafe (integration tests) mvn clean verify -Pintegration-tests ``` ### ❌ Missing Failsafe Executions Without proper `` configuration, failsafe tests might not run or results might not be verified. ## Verification Checklist - [ ] Normal build (`mvnw clean test`) excludes integration tests - [ ] Integration profile (`mvnw clean verify -Pintegration-tests`) skips unit tests - [ ] Integration profile successfully runs integration tests - [ ] CI/CD workflow includes integration test execution - [ ] Integration test naming follows Maven conventions - [ ] Both surefire exclusions and failsafe inclusions are properly configured ## Related Skills - `pm-dev-java:junit-core` - JUnit 5 core patterns - `pm-dev-java:java-cdi-quarkus` - Quarkus-specific testing - `pm-dev-builder:builder-maven-rules` - Maven build standards ## Additional Resources * [Maven Surefire Plugin Documentation](https://maven.apache.org/surefire/maven-surefire-plugin/) * [Maven Failsafe Plugin Documentation](https://maven.apache.org/surefire/maven-failsafe-plugin/) * [Maven Build Lifecycle](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html)