Arkhe-claude-plugins spring-boot-testing

Spring Boot 4 testing strategies and patterns. Use when writing unit tests, slice tests (@WebMvcTest, @DataJpaTest), integration tests, Testcontainers with @ServiceConnection, security testing (@WithMockUser, JWT), or Modulith event testing with Scenario API. Covers the critical @MockitoBean migration from @MockBean.

install
source · Clone the upstream repo
git clone https://github.com/joaquimscosta/arkhe-claude-plugins
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/joaquimscosta/arkhe-claude-plugins "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/spring-boot/skills/spring-boot-testing" ~/.claude/skills/joaquimscosta-arkhe-claude-plugins-spring-boot-testing && rm -rf "$T"
manifest: plugins/spring-boot/skills/spring-boot-testing/SKILL.md
source content

Spring Boot 4 Testing

Comprehensive testing patterns including slice tests, Testcontainers, security testing, and Modulith Scenario API.

Critical Breaking Change

Old (Boot 3.x)New (Boot 4.x)Notes
@MockBean
@MockitoBean
Required migration
@SpyBean
@MockitoSpyBean
Required migration
MockMvc
(procedural)
MockMvcTester
(fluent)
New AssertJ-style API
Implicit
@AutoConfigureMockMvc
Explicit annotation requiredAdd to
@SpringBootTest

MockMvcTester (Spring Boot 4)

New fluent, AssertJ-style API for controller testing:

@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired
    private MockMvcTester mvc;  // NEW: Fluent API

    @Test
    void getUser_returnsUser() {
        mvc.get().uri("/users/{id}", 1)
            .exchange()
            .assertThat()
            .hasStatusOk()
            .bodyJson()
            .extractingPath("$.name")
            .isEqualTo("John");
    }
}

Key Benefits: Fluent assertions, better error messages, AssertJ integration.

Test Annotation Selection

Test TypeAnnotationUse When
Controller
@WebMvcTest
Testing request/response, validation
Repository
@DataJpaTest
Testing queries, entity mapping
JSON
@JsonTest
Testing serialization/deserialization
REST Client
@RestClientTest
Testing external API clients
Full Integration
@SpringBootTest
End-to-end, with real dependencies
Module
@ApplicationModuleTest
Testing bounded context in isolation

Core Workflow

  1. Choose test slice → Minimal context for fast tests
  2. Mock dependencies
    @MockitoBean
    for external services
  3. Use Testcontainers
    @ServiceConnection
    for databases
  4. Assert thoroughly → Use AssertJ,
    MockMvcTester
    (new),
    RestTestClient
    (new), WebTestClient
  5. Test security
    @WithMockUser
    , JWT mocking

Quick Patterns

See EXAMPLES.md for complete working examples including:

  • @WebMvcTest with
    MockMvcTester
    and
    @MockitoBean
    (Java + Kotlin)
  • @DataJpaTest with
    TestEntityManager
    for lazy loading verification
  • Testcontainers with
    @ServiceConnection
    for PostgreSQL/Redis
  • Security Testing with
    @WithMockUser
    for role-based access
  • Modulith Event Testing with
    Scenario
    API

Detailed References

Anti-Pattern Checklist

Anti-PatternFix
Using
@MockBean
in Boot 4
Replace with
@MockitoBean
@SpringBootTest
for unit tests
Use appropriate slice annotation
Missing
entityManager.clear()
Add to verify lazy loading
High-cardinality test dataUse minimal, focused fixtures
Shared mutable test stateUse
@DirtiesContext
or fresh containers
No security testsAdd
@WithMockUser
tests for endpoints

Related Skills

NeedSkill
Security configuration
spring-boot-security
Module boundaries
spring-boot-modulith
Data layer patterns
spring-boot-data-ddd
Controller patterns
spring-boot-web-api

Critical Reminders

  1. @MockitoBean is mandatory
    @MockBean
    removed in Boot 4
  2. Slice tests are fast — Use them for focused testing
  3. Clear EntityManager — Required to test lazy loading behavior
  4. @ServiceConnection simplifies Testcontainers — No more
    @DynamicPropertySource
  5. Test security explicitly — Don't rely on disabled security