JUnit 5 testing extension for Quarkus applications providing comprehensive test support including CDI injection, mocking, and integration testing capabilities
npx @tessl/cli install tessl/maven-io-quarkus--quarkus-junit5@3.26.0Quarkus JUnit 5 is a comprehensive testing extension that provides full JUnit 5 integration for Quarkus applications. It enables developers to write unit tests, integration tests, and native image tests with complete CDI support, dependency injection, mocking capabilities, and application lifecycle management. The extension supports multiple testing modes including in-JVM testing, external artifact testing, and command-line application testing.
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>For Gradle:
testImplementation 'io.quarkus:quarkus-junit5'import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.QuarkusIntegrationTest;
import io.quarkus.test.junit.QuarkusMock;
import io.quarkus.test.junit.TestProfile;
import io.quarkus.test.junit.QuarkusTestProfile;For main method testing:
import io.quarkus.test.junit.main.QuarkusMainTest;
import io.quarkus.test.junit.main.QuarkusMainIntegrationTest;
import io.quarkus.test.junit.main.Launch;
import io.quarkus.test.junit.main.QuarkusMainLauncher;
import io.quarkus.test.junit.main.LaunchResult;For conditional testing:
import io.quarkus.test.junit.DisabledOnIntegrationTest;
import io.quarkus.test.junit.DisableIfBuiltWithGraalVMNewerThan;
import io.quarkus.test.junit.DisableIfBuiltWithGraalVMOlderThan;
import io.quarkus.test.junit.GraalVMVersion;For test callbacks:
import io.quarkus.test.junit.callback.QuarkusTestBeforeEachCallback;
import io.quarkus.test.junit.callback.QuarkusTestAfterEachCallback;
import io.quarkus.test.junit.callback.QuarkusTestAfterAllCallback;
import io.quarkus.test.junit.callback.QuarkusTestContext;
import io.quarkus.test.junit.callback.QuarkusTestMethodContext;import io.quarkus.test.junit.QuarkusTest;
import jakarta.inject.Inject;
import org.junit.jupiter.api.Test;
@QuarkusTest
class UserServiceTest {
@Inject
UserService userService;
@Test
void testCreateUser() {
User user = userService.createUser("John", "john@example.com");
assertEquals("John", user.getName());
}
}import io.quarkus.test.junit.QuarkusIntegrationTest;
import org.junit.jupiter.api.Test;
@QuarkusIntegrationTest
class UserServiceIntegrationTest {
@Test
void testUserEndpoint() {
// Test against built JAR/native image/container
given()
.when().get("/users")
.then()
.statusCode(200);
}
}import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.QuarkusMock;
import jakarta.inject.Inject;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@QuarkusTest
class UserServiceWithMockTest {
@Inject
UserService userService;
@Inject
UserRepository userRepository;
@BeforeEach
void setup() {
UserRepository mockRepo = Mockito.mock(UserRepository.class);
QuarkusMock.installMockForInstance(mockRepo, userRepository);
}
@Test
void testWithMock() {
// Test with mocked repository
}
}Quarkus JUnit 5 is built around several key components:
Primary annotations for different testing modes including unit tests with CDI injection, integration tests against built artifacts, and main method testing.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(QuarkusTestExtension.class)
public @interface QuarkusTest {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith({DisabledOnIntegrationTestCondition.class, QuarkusIntegrationTestExtension.class})
public @interface QuarkusIntegrationTest {
@Deprecated
interface Context extends DevServicesContext {
}
}Test profile system for managing different configurations, CDI alternatives, and test resources across different test scenarios.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestProfile {
Class<? extends QuarkusTestProfile> value();
}
public interface QuarkusTestProfile {
default Map<String, String> getConfigOverrides() { return Collections.emptyMap(); }
default Set<Class<?>> getEnabledAlternatives() { return Collections.emptySet(); }
default String getConfigProfile() { return null; }
default List<TestResourceEntry> testResources() { return Collections.emptyList(); }
default boolean disableGlobalTestResources() { return false; }
default Set<String> tags() { return Collections.emptySet(); }
default String[] commandLineParameters() { return new String[0]; }
default boolean runMainMethod() { return false; }
default boolean disableApplicationLifecycleObservers() { return false; }
}Runtime mock installation for CDI normal scoped beans, supporting both instance-based and type-based mocking with qualifier support.
public class QuarkusMock {
public static <T> void installMockForInstance(T mock, T instance);
public static <T> void installMockForType(T mock, Class<? super T> instance, Annotation... qualifiers);
public static <T> void installMockForType(T mock, TypeLiteral<? super T> typeLiteral, Annotation... qualifiers);
}Testing framework for command-line applications with support for parameter passing, exit code validation, and output capture.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(QuarkusMainTestExtension.class)
public @interface QuarkusMainTest {
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(QuarkusMainIntegrationTestExtension.class)
public @interface QuarkusMainIntegrationTest {
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Launch {
String[] value() default "";
int exitCode() default 0;
}
public interface QuarkusMainLauncher {
LaunchResult launch(String... args);
}Annotations for conditionally enabling or disabling tests based on integration test mode, GraalVM versions, and artifact types.
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DisabledOnIntegrationTest {
String value() default "";
ArtifactType[] forArtifactTypes() default {ArtifactType.ALL};
enum ArtifactType {
ALL, JAR, CONTAINER, NATIVE_BINARY
}
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(DisableIfBuiltWithGraalVMNewerThanCondition.class)
public @interface DisableIfBuiltWithGraalVMNewerThan {
GraalVMVersion value();
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(DisableIfBuiltWithGraalVMOlderThanCondition.class)
public @interface DisableIfBuiltWithGraalVMOlderThan {
GraalVMVersion value();
}Service provider interfaces for customizing test execution lifecycle with callbacks for various test phases including construction, setup, execution, and teardown.
public interface QuarkusTestBeforeEachCallback {
void beforeEach(QuarkusTestMethodContext context);
}
public interface QuarkusTestAfterEachCallback {
void afterEach(QuarkusTestMethodContext context);
}
public interface QuarkusTestAfterAllCallback {
void afterAll(QuarkusTestContext context);
}
public interface QuarkusTestBeforeClassCallback {
void beforeClass(Class<?> testClass);
}
public interface QuarkusTestAfterConstructCallback {
void afterConstruct(Object testInstance);
}
public interface QuarkusTestBeforeTestExecutionCallback {
void beforeTestExecution(QuarkusTestMethodContext context);
}
public interface QuarkusTestAfterTestExecutionCallback {
void afterTestExecution(QuarkusTestMethodContext context);
}// Package: io.quarkus.test.junit.callback
public class QuarkusTestContext {
public Object getTestInstance();
public List<Object> getOuterInstances();
public TestStatus getTestStatus();
}
public final class QuarkusTestMethodContext extends QuarkusTestContext {
public Method getTestMethod();
}public interface LaunchResult {
default String getOutput() { return String.join("\n", getOutputStream()); }
default String getErrorOutput() { return String.join("\n", getErrorStream()); }
default void echoSystemOut() { System.out.println(getOutput()); }
List<String> getOutputStream();
List<String> getErrorStream();
int exitCode();
}// Inner class of QuarkusTestProfile
public static final class TestResourceEntry {
public TestResourceEntry(Class<? extends QuarkusTestResourceLifecycleManager> clazz);
public TestResourceEntry(Class<? extends QuarkusTestResourceLifecycleManager> clazz, Map<String, String> args);
public TestResourceEntry(Class<? extends QuarkusTestResourceLifecycleManager> clazz, Map<String, String> args, boolean parallel);
public Class<? extends QuarkusTestResourceLifecycleManager> getClazz();
public Map<String, String> getArgs();
public boolean isParallel();
}public enum GraalVMVersion {
GRAALVM_23_1_0, GRAALVM_24_0_0, GRAALVM_24_0_999,
GRAALVM_24_1_0, GRAALVM_24_1_999, GRAALVM_24_2_0;
public GraalVM.Version getVersion();
public String toString();
}