Agent Skills: Java Integration Testing

>

testingID: bitsoex/bitso-java/java-setup-integration-tests

Install this agent skill to your local

pnpm dlx add-skill https://github.com/bitsoex/bitso-java/tree/HEAD/.claude/skills/java-setup-integration-tests

Skill Files

Browse the full folder contents for java-setup-integration-tests.

Download Skill

Loading file tree…

.claude/skills/java-setup-integration-tests/SKILL.md

Skill Metadata

Name
java-setup-integration-tests
Description
>

Java Integration Testing

Comprehensive integration testing patterns for Java/Spring Boot services using Spock Framework.

When to use this skill

  • Setting up integration tests for a new service
  • Migrating from unit tests to proper integration tests
  • Choosing mock strategy: GrpcMock/WireMock (preferred) vs @MockitoBean/@SpringBean (ProtoShims only)
  • Configuring Testcontainers (PostgreSQL, Valkey/Redis)
  • Testing gRPC handlers or external gRPC clients
  • Testing REST controllers with MockMvc
  • Testing Kafka consumers with EmbeddedKafka

Skill Contents

Sections

Available Resources

πŸ“š references/ - Detailed documentation


Quick Decision Tree

What are you testing?
β”‚
β”œβ”€β–Ί Your own gRPC handlers?
β”‚   └─► Use [grpc-handler-testing.md](references/grpc-handler-testing.md)
β”‚       (In-process transport, GrpcClientTestConfig)
β”‚
β”œβ”€β–Ί External gRPC clients (retries/timeouts)?
β”‚   └─► Use [grpcmock-setup.md](references/grpcmock-setup.md)
β”‚       (WireMock-like stubbing for gRPC)
β”‚
β”œβ”€β–Ί REST controllers?
β”‚   └─► Use [rest-controller-testing.md](references/rest-controller-testing.md)
β”‚       (MockMvc, @AutoConfigureMockMvc)
β”‚
β”œβ”€β–Ί Kafka consumers?
β”‚   └─► Use [kafka-testing.md](references/kafka-testing.md)
β”‚       (@EmbeddedKafka, KafkaTestUtils)
β”‚
β”œβ”€β–Ί Setting up BaseIntegrationSpec?
β”‚   └─► Use [base-spec-patterns.md](references/base-spec-patterns.md)
β”‚       (Mock framework choice, reset strategies)
β”‚
└─► Configuring containers?
    └─► Use [testcontainers-setup.md](references/testcontainers-setup.md)
        (PostgreSQL jdbc:tc, Valkey)

Core Principles

The Golden Rules

| Rule | Why | |------|-----| | Real domain services | Tests should exercise actual business logic | | Real repositories | Use Testcontainers for DB/cache | | Prefer GrpcMock/WireMock for external services | Tests real client wrappers, resilience, error codes | | Bean mocking only for ProtoShims/custom RPCs | Use @MockitoBean/@SpringBean only when GrpcMock/WireMock is not feasible | | Reset mocks in setup() | Prevent test interference (@MockitoBean only) | | Clean data in cleanup() | Ensure test isolation | | No @DirtiesContext | Use proper cleanup instead | | No @Transactional on tests | Let transactions commit to test real behavior | | Static containers | Share across test classes for speed | | Centralize config in BaseSpec | All test beans and mocks in base class |

External Dependency Mocking Hierarchy

Always prefer the highest-fidelity mock available:

PREFER (most realistic)                    AVOID (least realistic)
─────────────────────────────────────────────────────────────────────
  GrpcMock          WireMock          @MockitoBean/@SpringBean
  (gRPC services)   (REST services)   (ONLY for ProtoShims/custom RPCs)

| External Dependency Type | Mock Strategy | Why | |--------------------------|---------------|-----| | Standard gRPC service | GrpcMock (always) | Tests real client wrapper, retry logic, error codes, timeouts | | Standard REST service | WireMock (always) | Tests real HTTP client, error handling, serialization | | ProtoShim / custom RPC (e.g., UserModel, TradeModel) | @MockitoBean/@SpringBean | Custom protocols not directly testable via GrpcMock | | Kafka producer | @MockitoBean/@SpringBean | No network mock available |

Why GrpcMock/WireMock over bean mocking:

  • Tests the real client wrapper code (serialization, error mapping, retries)
  • Catches bugs in client configuration and resilience patterns
  • More realistic - simulates actual network behavior
  • Single GrpcMock server handles ALL external gRPC services

What to Mock vs Use Real

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Test JVM Process                              β”‚
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚  β”‚ Test Code       β”‚     β”‚      Spring Boot Context            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚                                     β”‚    β”‚
β”‚  β”‚ Direct API call β”‚ ──► β”‚  Handler / Controller               β”‚    β”‚
β”‚  β”‚ (stub or HTTP)  β”‚     β”‚         β”‚                           β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚         β–Ό                           β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”‚   Domain Service    β”‚            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”‚   (REAL impl)       β”‚            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”‚         β”‚           β”‚            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”‚    β”Œβ”€β”€β”€β”€β”΄β”€β”€β”€β”€β”      β”‚            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”‚    β–Ό         β–Ό      β”‚            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”‚ Repository  Cache   β”‚            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β”‚ (REAL)     (REAL)   β”‚            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚                                     β”‚    β”‚
β”‚  β”‚  GrpcMock/      β”‚     β”‚  gRPC Client ──────► GrpcMock      β”‚    β”‚
β”‚  β”‚  WireMock       β”‚     β”‚  (REAL wrapper)      Server        β”‚    β”‚
β”‚  β”‚  (preferred)    β”‚     β”‚                                     β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  REST Client ──────► WireMock       β”‚    β”‚
β”‚  β”‚  @SpringBean    β”‚     β”‚  (REAL wrapper)      Server        β”‚    β”‚
β”‚  β”‚  (ProtoShims    β”‚     β”‚                                     β”‚    β”‚
β”‚  β”‚   only)         β”‚     β”‚  ProtoShim ◄──── @SpringBean MOCK  β”‚    β”‚
β”‚  β”‚                 β”‚     β”‚  (custom RPC)                       β”‚    β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                                                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚   PostgreSQL    β”‚  β”‚     Valkey      β”‚  β”‚     Kafka       β”‚     β”‚
β”‚  β”‚  Testcontainer  β”‚  β”‚  Testcontainer  β”‚  β”‚  EmbeddedKafka  β”‚     β”‚
β”‚  β”‚  (if needed)    β”‚  β”‚  (if needed)    β”‚  β”‚  (if needed)    β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Mock Framework Choice

When bean mocking IS needed (ProtoShims/custom RPCs only):

| Approach | Annotation | Mock Syntax | Verification | Reset Needed | |----------|------------|-------------|--------------|--------------| | Mockito | @MockitoBean | when(mock.method()).thenReturn(value) | verify(mock).method() | Yes | | Spock | @SpringBean | mock.method() >> value | 1 * mock.method() | No |

WARNING: You cannot mix syntaxes! With @MockitoBean, Spock's >> syntax will NOT work.

See base-spec-patterns.md for detailed examples.


References

| Reference | Description | |-----------|-------------| | base-spec-patterns.md | BaseIntegrationSpec patterns with mock frameworks | | testcontainers-setup.md | Container configuration patterns | | grpc-handler-testing.md | Testing your own gRPC handlers | | grpcmock-setup.md | GrpcMock for external services | | rest-controller-testing.md | REST controller testing | | kafka-testing.md | Kafka consumer testing |

Related Skills

| Skill | Purpose | |-------|---------| | java-testing | General testing guidelines | | java-coverage | JaCoCo coverage setup | | grpc-services-rfc-33 | gRPC service standards |

<!-- AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY --> <!-- Source: bitsoex/ai-code-instructions β†’ java/skills/java-setup-integration-tests/SKILL.md --> <!-- To modify, edit the source file and run the distribution workflow -->