Skip to content

Test Classes Migration Complete

Date: October 13, 2025
Status: ✅ SUCCESSFULLY COMPLETED

Summary

All test classes have been successfully migrated from JUnit 4 to JUnit 5 (Jupiter) and updated to be compatible with Spring Boot 3.2.10, Java 21, and Gradle 8.11.1.

Test Compilation Status

./gradlew compileTestJava
BUILD SUCCESSFUL in 1s ✅

Changes Made

1. JUnit 4 → JUnit 5 Migration

Import Changes:

// Before (JUnit 4)
import org.junit.Test;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.junit.Assert.*;
import org.springframework.test.context.junit4.SpringRunner;

// After (JUnit 5)
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
// No @RunWith needed
import org.junit.jupiter.api.Assertions.*;
// No SpringRunner needed

Annotation Changes: - @RunWith(SpringRunner.class) → Removed (not needed in JUnit 5) - @Before → @BeforeEach - @Ignore → @Disabled - @Test → @Test (same annotation, different package)

Method Visibility: - Changed from public void to void (JUnit 5 doesn't require public methods)

2. Mockito Updates

For Unit Tests:

// Before (JUnit 4)
@RunWith(MockitoJUnitRunner.class)
import org.mockito.runners.MockitoJUnitRunner;

// After (JUnit 5)
@ExtendWith(MockitoExtension.class)
import org.mockito.junit.jupiter.MockitoExtension;

3. Assertion Updates

Changed to JUnit 5 Assertions:

// Before (JUnit 4)
import static org.junit.Assert.assertTrue;
assertTrue(fetchedProducts.size() == 1);

// After (JUnit 5)
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
assertEquals(1, fetchedProducts.size());

4. Bouncycastle Objects → Java Objects

Fixed Incorrect Import:

// Before (Wrong library)
import org.bouncycastle.util.Objects;
assertTrue(Objects.areEqual(savedProduct, expectedProduct));

// After (Java standard library)
import java.util.Objects;
assertTrue(Objects.equals(savedProduct, expectedProduct));

Files Modified

Test Files Updated (5 files)

  1. MainSBControllerTest.java
  2. Removed @RunWith(SpringRunner.class)
  3. Updated to JUnit 5 imports
  4. Changed method visibility to package-private

  5. ProbeControllerTest.java

  6. Removed @RunWith(SpringRunner.class)
  7. Updated to JUnit 5 imports
  8. Changed method visibility to package-private

  9. ProductRepositoryTest.java

  10. Removed @RunWith(SpringRunner.class)
  11. Updated to JUnit 5 imports
  12. Fixed Bouncycastle Objects → java.util.Objects
  13. @Before → @BeforeEach
  14. Updated assertions to JUnit 5

  15. ProductServiceTest.java

  16. @RunWith(MockitoJUnitRunner.class) → @ExtendWith(MockitoExtension.class)
  17. Updated to JUnit 5 imports
  18. Fixed Bouncycastle Objects → java.util.Objects
  19. Updated assertions to JUnit 5

  20. ActuatorEndpointsTest.java (Already updated in previous session)

  21. JUnit 5 migration complete
  22. Jakarta namespace migration complete

Test Files Not Modified

  1. BootstrapTests.java - Already using JUnit 5 ✅
  2. ControllerCircuitBreakerTest.java - Empty test class (no changes needed)
  3. TestHelper.java - Utility class (no test framework dependencies)

Key Migration Patterns

Pattern 1: Spring Boot Integration Tests

// JUnit 5 with Spring Boot 3.x
@SpringBootTest
@AutoConfigureMockMvc
public class MyControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    void testEndpoint() throws Exception {
        // test code
    }
}

Pattern 2: Pure Unit Tests with Mockito

// JUnit 5 with Mockito
@ExtendWith(MockitoExtension.class)
public class MyServiceTest {
    @InjectMocks
    private MyService sut;

    @Mock
    private MyRepository mockRepo;

    @Test
    void testMethod() {
        // test code
    }
}

Pattern 3: Setup Methods

// JUnit 5 setup
@BeforeEach
void setup() {
    // initialization code
}

Compatibility Matrix

Component Version Status
JUnit 5 (Jupiter) ✅
Mockito 5.8.0 ✅
Spring Boot Test 3.2.10 ✅
Java 21 ✅
Gradle 8.11.1 ✅

Build Configuration

The build.gradle already has JUnit 5 configured:

test {
    useJUnitPlatform() // Enables JUnit 5
}

dependencies {
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.hamcrest:hamcrest-all:1.3'
    testImplementation 'org.mockito:mockito-core:5.8.0'
    testImplementation 'org.mockito:mockito-junit-jupiter:5.8.0' // JUnit 5 support
    testImplementation 'com.tngtech.archunit:archunit-junit5:1.2.1'
    testImplementation 'io.rest-assured:rest-assured:5.4.0'
    testImplementation 'io.rest-assured:json-path:5.4.0'
    testImplementation 'io.rest-assured:json-schema-validator:5.4.0'
}

Next Steps

Immediate

  1. Run tests: ./gradlew test
  2. Expected: Some tests may fail due to MongoDB connection issues (known from previous phases)
  3. Action: Fix MongoDB configuration or mock MongoDB dependencies

  4. Review test coverage

  5. Run: ./gradlew jacocoTestReport
  6. Check coverage reports

Future Enhancements

  1. Add more JUnit 5 features:
  2. @ParameterizedTest for data-driven tests
  3. @RepeatedTest for repeated execution
  4. @TestInstance for lifecycle management
  5. @Nested for better test organization

  6. Update test assertions:

  7. Consider using AssertJ for more fluent assertions
  8. Add custom assertion messages

  9. Improve test isolation:

  10. Use @DirtiesContext where needed
  11. Consider test containers for MongoDB

Verification Commands

# Compile all test classes
./gradlew compileTestJava
# ✅ BUILD SUCCESSFUL

# Run all tests
./gradlew test

# Run specific test class
./gradlew test --tests "com.anr.controller.MainSBControllerTest"

# Run with coverage
./gradlew test jacocoTestReport

Common JUnit 5 Migration Issues (Resolved)

✅ Issue 1: Package Imports

  • Problem: JUnit 4 uses org.junit.*, JUnit 5 uses org.junit.jupiter.api.*
  • Solution: Updated all imports to JUnit 5 packages

✅ Issue 2: SpringRunner

  • Problem: @RunWith(SpringRunner.class) not available in JUnit 5
  • Solution: Removed annotation (Spring Boot 3.x auto-detects JUnit 5)

✅ Issue 3: Mockito Runner

  • Problem: MockitoJUnitRunner is JUnit 4 specific
  • Solution: Use @ExtendWith(MockitoExtension.class) for JUnit 5

✅ Issue 4: Method Visibility

  • Problem: JUnit 4 required public test methods
  • Solution: JUnit 5 allows package-private methods (cleaner)

✅ Issue 5: Bouncycastle Objects

  • Problem: Wrong library used for object comparison
  • Solution: Use java.util.Objects instead

Summary Statistics

  • Total Test Files: 8
  • Files Updated: 5
  • Files Already Compliant: 1
  • Empty Test Files: 1
  • Utility Files: 1
  • Compilation Status: ✅ SUCCESS
  • Migration Time: ~15 minutes

Documentation References


Migration Status: ✅ COMPLETE
Test Compilation: ✅ SUCCESSFUL
Ready for: Test execution and debugging