Boot the app.
Verify the flow.
Stove starts the application under test, wires the dependencies it talks to, and lets you assert the complete flow in one Kotlin DSL. Postgres, Kafka, Redis, gRPC, WireMock, tracing, and more. JVM-first. Polyglot-ready.
In 30 seconds
Stove registers the systems your app depends on, then registers one AUT runner. A system is a dependency, client, mock, or observability module such as HTTP, PostgreSQL, Kafka, WireMock, tracing, or dashboard. An AUT runner starts the app through a framework, process, or container runner, or targets an already-running app with providedApplication(). For framework/process/container runners, Stove passes generated connection details before the app starts; provided applications must already be configured externally. When a test fails, the failure report adds a timeline and system snapshots to the stack trace.
What you actually get¶
Testcontainers by default, or provided instances when existing infrastructure should be reused.
The same stove { } shape works across Postgres, Kafka, gRPC, WireMock, Redis, MongoDB, Elasticsearch, and custom systems.
Spring, Ktor, Micronaut, and Quarkus runners, plus Go, Python, Rust, Node, and other apps through process or container mode.
Reporting is built in; tracing adds span trees, dashboard stores run evidence, and MCP exposes agent-readable evidence when enabled.
See the run while it happens¶
When dashboard { } is registered and the stove CLI is running, registered systems stream local run evidence into a dashboard you can keep open while iterating. Timeline entries, system snapshots, Kafka observations, and exported spans stay attached to the test that produced them.
412 ms
- HTTP POST /orders 201 / 42 ms
- PostgreSQL insert orders 18 ms
- Kafka order.created published partition 0
- HTTP POST /payment/charge 500 / 117 ms
Setup wizard¶
Pick runtime, framework, systems, mocks, and observability. The wizard composes version-aligned Gradle dependencies, StoveConfig.kt, and a sample test that exercises the selected systems. State syncs to the URL; share or bookmark presets.
Why Stove exists¶
JVM frameworks solve application startup well, but e2e suites still need the same surrounding mechanics in every service: dependency lifecycle, dynamic ports, runtime configuration, application boot, cleanup, and diagnostics.
Without Stove
- Hand-rolled Testcontainers setup per service
- Mocks where they shouldn't be (the bug hides there)
- Framework-specific test harness rewritten each time
- Stack traces without the system timeline
- Separate test harnesses for polyglot services
With Stove
- Declarative
Stove().with { ... }wiring - Real DB, real broker, and external services mocked only at the network boundary
- One DSL across Spring · Ktor · Micronaut · Quarkus
- Failures include timeline and snapshots; tracing, dashboard, and MCP add deeper evidence when enabled
- Go/Python/Rust apps drop in via process/container mode
One testing model. Many stacks.
Architecture¶
Building from source¶
Background and motivation: original Medium article.