diff --git a/java/templates/java-maven-quarkus/README.md b/java/templates/java-maven-quarkus/README.md
index 6def4686..7d7c5f6c 100644
--- a/java/templates/java-maven-quarkus/README.md
+++ b/java/templates/java-maven-quarkus/README.md
@@ -12,4 +12,10 @@ To start the service, simply run:
```shell
$ quarkus dev
-```
\ No newline at end of file
+```
+
+## Unit testing
+
+The restate `RestateExtension` junit extension does currently not work together with quarkus CDI, so you cannot combine
+`@RestateTest` with `@QuarkusTest`, so if you want to use `@Inject` in unit test with restate services, you must use
+the `RestateRunner` directly as shown in the `GreeterCdiTest`.
\ No newline at end of file
diff --git a/java/templates/java-maven-quarkus/pom.xml b/java/templates/java-maven-quarkus/pom.xml
index ad65c2a2..72b3708c 100644
--- a/java/templates/java-maven-quarkus/pom.xml
+++ b/java/templates/java-maven-quarkus/pom.xml
@@ -39,6 +39,10 @@
io.quarkus
quarkus-vertx
+
+ io.quarkus
+ quarkus-junit5
+
dev.restate
@@ -46,6 +50,13 @@
${restate.version}
+
+ dev.restate
+ sdk-testing
+ ${restate.version}
+ test
+
+
com.google.protobuf
diff --git a/java/templates/java-maven-quarkus/src/test/java/org/acme/GreeterCdiTest.java b/java/templates/java-maven-quarkus/src/test/java/org/acme/GreeterCdiTest.java
new file mode 100644
index 00000000..e4c162a7
--- /dev/null
+++ b/java/templates/java-maven-quarkus/src/test/java/org/acme/GreeterCdiTest.java
@@ -0,0 +1,44 @@
+package org.acme;
+
+import dev.restate.client.Client;
+import dev.restate.sdk.endpoint.Endpoint;
+import dev.restate.sdk.testing.RestateRunner;
+import io.quarkus.test.junit.QuarkusTest;
+import jakarta.inject.Inject;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@QuarkusTest
+public class GreeterCdiTest {
+
+ @Inject
+ Greeter greeter;
+
+ static RestateRunner restateRunner;
+
+ @BeforeEach
+ void beforeEach() {
+ if (restateRunner == null) {
+ restateRunner = RestateRunner.from(Endpoint.builder().bind(greeter).build()).build();
+ restateRunner.start();
+ }
+ }
+
+ @AfterAll
+ static void afterAll() {
+ if (restateRunner != null && restateRunner.getRestateContainer().isRunning()) {
+ restateRunner.stop();
+ }
+ }
+
+ @Test
+ void test() {
+ var ingressClient = Client.connect(restateRunner.getRestateUrl().toString());
+ var c = GreeterClient.fromClient(ingressClient);
+ var response = c.greet(new Greeter.Greeting("John Doe"));
+ assertEquals("You said hi to John Doe!", response.message());
+ }
+}
diff --git a/java/templates/java-maven-quarkus/src/test/java/org/acme/GreeterTest.java b/java/templates/java-maven-quarkus/src/test/java/org/acme/GreeterTest.java
new file mode 100644
index 00000000..b3669c8c
--- /dev/null
+++ b/java/templates/java-maven-quarkus/src/test/java/org/acme/GreeterTest.java
@@ -0,0 +1,24 @@
+package org.acme;
+
+import dev.restate.client.Client;
+import dev.restate.sdk.testing.BindService;
+import dev.restate.sdk.testing.RestateClient;
+import dev.restate.sdk.testing.RestateTest;
+import org.acme.Greeter.GreetingResponse;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@RestateTest
+public class GreeterTest {
+
+ @BindService
+ Greeter greeter = new Greeter();
+
+ @Test
+ void test(@RestateClient Client ingressClient) {
+ GreeterClient.IngressClient c = GreeterClient.fromClient(ingressClient);
+ GreetingResponse response = c.greet(new Greeter.Greeting("John Doe"));
+ assertEquals("You said hi to John Doe!", response.message());
+ }
+}