Skip to content

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:

quarkus.class-loading.parent-first-artifacts=org.apache.kafka:kafka-clients

Without this, Stove's Kafka interceptor can't attach.

What you get

  • ✅ Real Quarkus startup via the normal main
  • ✅ Tracing, reporting, and dashboard when configured; MCP when the stove CLI is running and dashboard data exists
  • ❌ Bridge. 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 }
    }
  }
}

Example