0.21.0¶
Released: February 2026
This release introduces:
- Tracing: See the full execution trace of your application when a test fails: every controller, database query, Kafka message, and HTTP call with timing and failure points
- gRPC Mocking: Mock external gRPC services in your tests with a type-safe DSL
- MySQL Support: New
stove-mysqlmodule for testing against MySQL databases - WireMock Test Scoping: WireMock snapshots are now scoped to the current test for cleaner failure reports
- Dynamic Port Allocation: WireMock now defaults to
port = 0and gRPC Mock supports it, no more port conflicts in CI - Migration Type Aliases:
PostgresqlMigration,MongodbMigration, etc. instead of verboseDatabaseMigration<XyzContext> - Elasticsearch 9 Support: Adapted to work with Elasticsearch 9.x
- Spring Showcase Recipe: A comprehensive example project demonstrating all Stove features together
New Features¶
Tracing¶
When a test fails, you no longer have to guess what happened inside your application. Stove captures the entire call chain: every controller method, database query, Kafka message, and HTTP call, and displays it as a trace tree in the failure report:
═══════════════════════════════════════════════════════════════════════════════
EXECUTION TRACE (Call Chain)
═══════════════════════════════════════════════════════════════════════════════
✓ POST (377ms)
✓ POST /api/product/create (361ms)
✓ ProductController.create (141ms)
✓ ProductCreator.create (0ms)
✓ KafkaProducer.send (137ms)
✓ orders.created publish (81ms)
✗ orders.created process (82ms) ← FAILURE POINT
Setup takes two steps:
- Enable in your Stove config:
- Attach the OpenTelemetry agent in your build. Copy
StoveTracingConfiguration.ktto your project'sbuildSrc/src/main/kotlin/directory, then add to yourbuild.gradle.kts:
Gradle Plugin available since 0.21.2
Starting with 0.21.2, a standalone Gradle plugin is available that eliminates the need to copy this file. See the 0.21.2 release notes for details.
Everything else is automatic. Trace headers are injected into HTTP, Kafka, and gRPC calls, spans are collected and correlated, and failure reports are enriched with the trace tree.
A validation DSL is also available for asserting on the execution flow:
tracing {
shouldContainSpan("OrderService.processOrder")
shouldNotHaveFailedSpans()
executionTimeShouldBeLessThan(500.milliseconds)
}
See the Tracing documentation for full details.
gRPC Mocking¶
New stove-grpc-mock module for mocking external gRPC services in your tests. This lets you test gRPC client code without running the actual upstream services.
Configure in your Stove setup:
Stub responses with a type-safe DSL:
grpcMock {
mockUnary(
FraudDetectionServiceGrpc.getCheckFraudMethod(),
response = FraudCheckResponse.newBuilder()
.setIsFraud(false)
.setScore(0.1)
.build()
)
}
Supports unary, server streaming, and conditional matching. See the gRPC Mocking documentation for full details.
MySQL Support¶
New stove-mysql module with the same familiar DSL as PostgreSQL and MSSQL:
Stove()
.with {
mysql {
MysqlOptions(
databaseName = "mydb",
configureExposedConfiguration = { cfg ->
listOf(
"spring.datasource.url=${cfg.jdbcUrl}",
"spring.datasource.username=${cfg.username}",
"spring.datasource.password=${cfg.password}"
)
}
)
}
}
Supports migrations, shouldQuery, shouldExecute, and all the database operations you'd expect. See the MySQL documentation for details.
WireMock Test Scoping¶
WireMock snapshots in failure reports are now scoped to the current test. Previously, all registered stubs and requests across the entire test suite would appear in the snapshot. Now you only see stubs and requests relevant to the test that failed, making failure reports much easier to read.
Dynamic Port Allocation¶
Both WireMock and gRPC Mock now support dynamic port allocation with port = 0, which prevents port conflicts when running tests in parallel on CI.
WireMock now defaults to port = 0. You no longer need to pick a port:
wiremock {
WireMockSystemOptions(
configureExposedConfiguration = { cfg ->
listOf("external-apis.inventory.url=${cfg.baseUrl}")
}
)
}
gRPC Mock also supports port = 0:
In both cases, the actual port is exposed via configureExposedConfiguration so your application receives the correct URL.
Spring Showcase Recipe¶
A new comprehensive recipe at recipes/kotlin-recipes/spring-showcase/ demonstrates all Stove features working together in a realistic Spring Boot application:
- HTTP endpoints with PostgreSQL
- Kafka producers and consumers
- gRPC server and client with mocked upstream
- WireMock for external HTTP APIs
- Tracing
- Database migrations
- db-scheduler integration
This is the best starting point for understanding how Stove fits into a real project.
Migration Type Aliases¶
Each module that supports migrations now provides a convenient type alias, so you no longer need to remember DatabaseMigration<PostgresSqlMigrationContext> and similar verbose signatures:
// Before
class CreateUsersTable : DatabaseMigration<PostgresSqlMigrationContext> { ... }
// After
class CreateUsersTable : PostgresqlMigration { ... }
Available aliases:
| Module | Type Alias |
|---|---|
| stove-postgres | PostgresqlMigration |
| stove-mysql | MySqlMigration |
| stove-mssql | MsSqlMigration |
| stove-mongodb | MongodbMigration |
| stove-couchbase | CouchbaseMigration |
| stove-elasticsearch | ElasticsearchMigration |
| stove-redis | RedisMigration |
| stove-kafka | KafkaMigration |
The generic DatabaseMigration<T> interface remains fully supported. The aliases are purely additive.
Improvements¶
Elasticsearch 9 Support¶
stove-elasticsearch now works with Elasticsearch 9.x (specifically 9.3.0). The module adapts to the updated client API automatically.
Improved Failure Reports¶
- Exception details (type, message, stack trace) are now extracted from OpenTelemetry spans and displayed in trace trees
- Console renderer output is cleaner and better formatted
- Kafka report entries now include all relevant state
Tracing Configuration Cache Compatibility¶
The Stove Tracing Gradle plugin and the stoveTracing buildSrc helper are both fully compatible with Gradle configuration cache, so builds with --configuration-cache work correctly.
Non-ASCII Test ID Support¶
Trace context test IDs now handle non-ASCII characters (e.g., Japanese, Korean) correctly by normalizing to ASCII with hash suffixes for uniqueness. This ensures consistent behavior when test names use non-Latin scripts.
BridgeSystem Suspended¶
BridgeSystem methods are now suspend functions, allowing proper coroutine support in bridge implementations.
Bug Fixes¶
- HTTP streaming: Fixed a flow collection issue that could cause streaming responses to hang
- Kafka tests: Fixed flaky test behavior in Kafka system tests
- Tracing configuration cache: Fixed serialization issues when using Gradle configuration cache with the Stove Tracing plugin
- ASCII character handling: Fixed edge cases in test ID sanitization for non-ASCII characters
Dependency Updates¶
- Elasticsearch 9.3.0
- Kafka (Confluent) 8.1.1
- Confluent Platform Kafka 8.0.3
- gRPC Java 1.79.0
- Protobuf 4.33.5
- OpenTelemetry 1.59.0
- Kotlin (latest patch)
- Ktor 3.4.0
- Flyway 12.x
- HikariCP 7.x
- Various Spring, Quarkus, and Micronaut updates
Migration Guide¶
From 0.20.x to 0.21.0¶
This is a non-breaking release. All existing APIs remain compatible.
New Features to Opt Into¶
Tracing: Add stove-tracing to your dependencies and follow the setup guide.
gRPC Mocking: Add stove-grpc-mock to your dependencies if you need to mock external gRPC services. See the gRPC Mocking documentation.
MySQL: Add stove-mysql if you're testing against MySQL. See the MySQL documentation.
Test Framework Extensions¶
StoveKotestExtension (stove-extensions-kotest) and StoveJUnitExtension (stove-extensions-junit) are separate packages that must be on your classpath. Kotest requires 6.1.3 or later; JUnit requires Jupiter 6.x if possible.
In Kotest 6.x, AbstractProjectConfig is no longer auto-scanned. Add a kotest.properties file in your test resources (e.g. src/test-e2e/resources/kotest.properties):
Set the value to the fully qualified name of your AbstractProjectConfig class. See the Getting Started guide for full details.
Recommended Updates¶
- If using Elasticsearch, verify compatibility with Elasticsearch 9.x
- If using the Stove Tracing plugin or
stoveTracing, no changes needed. Configuration cache compatibility is automatic - Consider switching
GrpcMockSystemOptionstoport = 0for CI-friendly dynamic port allocation
Getting Started¶
dependencies {
testImplementation(platform("com.trendyol:stove-bom:0.21.0"))
testImplementation("com.trendyol:stove")
testImplementation("com.trendyol:stove-spring")
testImplementation("com.trendyol:stove-tracing")
testImplementation("com.trendyol:stove-extensions-kotest")
// Add components as needed
}
For snapshot versions: