Quarkus¶
Stove starts the real Quarkus runtime. The main caveat is that bridge() is not shipped yet, so verification should go through HTTP, DB queries, Kafka observations, gRPC, or other external systems.
Open Quarkus + Postgres + Kafka in wizard
Quarkus specifics
1) Keep @QuarkusMain intact. 2) Publish a readiness signal if your app has no HTTP. 3) Bridge is unavailable. Use system DSLs (postgresql, kafka, etc.) for state verification.
Setup¶
dependencies {
testImplementation(platform("com.trendyol:stove-bom:$stoveVersion"))
testImplementation("com.trendyol:stove")
testImplementation("com.trendyol:stove-quarkus")
testImplementation("com.trendyol:stove-extensions-kotest") // or -junit
testImplementation("com.trendyol:stove-http")
testImplementation("com.trendyol:stove-postgres")
testImplementation("com.trendyol:stove-kafka")
testImplementation("com.trendyol:stove-wiremock")
testImplementation("com.trendyol:stove-tracing")
}
Keep the normal Quarkus entrypoint:
@QuarkusMain
object QuarkusMainApp {
@JvmStatic
fun main(args: Array<String>) {
Quarkus.run(*args)
}
}
If your app does not expose an HTTP endpoint, publish a startup signal so Stove can detect readiness:
@ApplicationScoped
class StoveStartupSignal {
fun onStart(@Observes event: StartupEvent) =
System.setProperty("stove.quarkus.ready", "true")
fun onStop(@Observes event: ShutdownEvent) =
System.clearProperty("stove.quarkus.ready")
}
Minimal Stove().with { }:
Stove().with {
tracing { enableSpanReceiver() }
quarkus(
runner = { params -> QuarkusMainApp.main(params) },
withParameters = listOf("quarkus.http.port=8080")
)
}.run()
Kafka note¶
stove-kafka + Quarkus Kafka clients need shared classloading. Add to application.properties:
Without this, Stove's Kafka interceptor can't attach.
What you get¶
Real Quarkus startup via the normal
mainTracing, reporting, and dashboard when configured; MCP when the
stoveCLI is running and dashboard data existsBridge. Not yet (verify through systems)
Verification without Bridge¶
Instead of using<OrderService> { ... }, query state through the systems your app writes to:
test("order is created") {
val id = UUID.randomUUID().toString()
stove {
http {
post<OrderResponse>("/orders", CreateOrderRequest(id).some()) {
it.status shouldBe 201
}
}
postgresql {
shouldQuery<OrderRow>(
query = "SELECT id, status FROM orders WHERE id = '$id'",
mapper = { row -> OrderRow(row.string("id"), row.string("status")) }
) {
it.first().status shouldBe "CREATED"
}
}
kafka {
shouldBePublished<OrderCreated> { actual.id == id }
}
}
}