CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-io-quarkus--quarkus-junit5-internal

A runner for unit tests, intended for testing Quarkus rather than for end user consumption.

Pending
Overview
Eval results
Files

prod-mode-testing.mddocs/

Production Mode Testing

The QuarkusProdModeTest class provides testing capabilities for production-mode jars with native build support, runtime configuration, and process lifecycle management.

Core API

Basic Setup

public class QuarkusProdModeTest implements BeforeAllCallback, AfterAllCallback, 
    BeforeEachCallback, TestWatcher, InvocationInterceptor {
    
    public QuarkusProdModeTest();
}

Archive Configuration

Configure the application archive:

public Supplier<JavaArchive> getArchiveProducer();
public QuarkusProdModeTest setArchiveProducer(Supplier<JavaArchive> archiveProducer);
public QuarkusProdModeTest withApplicationRoot(Consumer<JavaArchive> applicationRootConsumer);
public QuarkusProdModeTest withEmptyApplication();

Build Chain Customization

Add build chain customizers and custom resources:

public QuarkusProdModeTest addBuildChainCustomizerEntries(BuildChainCustomizerEntry entry);
public QuarkusProdModeTest addCustomResourceEntry(Path outputPath, String classPathLocation);

Application Configuration

Configure application metadata:

public QuarkusProdModeTest setApplicationName(String applicationName);
public QuarkusProdModeTest setApplicationVersion(String applicationVersion);

Build Configuration

Configure build options:

public QuarkusProdModeTest setBuildNative(boolean buildNative);
public QuarkusProdModeTest setRun(boolean run);

Runtime Configuration

Configure runtime behavior:

public QuarkusProdModeTest setJVMArgs(List<String> jvmArgs);
public QuarkusProdModeTest setRuntimeProperties(Map<String, String> runtimeProperties);

Logging Configuration

Configure logging behavior:

public QuarkusProdModeTest setLogFileName(String logFileName);
public QuarkusProdModeTest setLogRecordPredicate(Predicate<LogRecord> predicate);

Dependencies Management

Configure forced dependencies:

public QuarkusProdModeTest setForcedDependencies(List<Dependency> forcedDependencies);

Process Control

Control application process lifecycle:

public QuarkusProdModeTest setExpectExit(boolean expectExit);
public void start();
public void stop();

Exception Handling

Configure build and runtime exception handling:

public QuarkusProdModeTest assertBuildException(Consumer<Throwable> exceptionAssert);
public QuarkusProdModeTest setExpectedException(Class<? extends Throwable> expectedException);

Output Access

Access application output and exit status:

public String getStartupConsoleOutput();
public Integer getExitCode();

Configuration Management

Override configuration keys and provide resources:

public QuarkusProdModeTest withConfigurationResource(String resourceName);
public QuarkusProdModeTest overrideConfigKey(String propertyKey, String propertyValue);
public QuarkusProdModeTest setCommandLineParameters(String... commandLineParameters);

Nested Types

BuildChainCustomizerEntry

public static class BuildChainCustomizerEntry {
    public BuildChainCustomizerEntry(Class<? extends ProdModeTestBuildStep> buildStepClass,
        List<Class<? extends BuildItem>> produces, List<Class<? extends BuildItem>> consumes);
    public Class<? extends BuildStep> getBuildStepClass();
    public List<Class<? extends BuildItem>> getProduces();
    public List<Class<? extends BuildItem>> getConsumes();
}

Constants

public static String BUILD_CONTEXT_CUSTOM_SOURCES_PATH_KEY = "customSourcesDir";

Key for custom sources directory in build context.

Usage Examples

Basic Production Mode Test

import io.quarkus.test.QuarkusProdModeTest;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.api.Test;

public class ProdModeTest {
    
    @RegisterExtension
    static final QuarkusProdModeTest config = new QuarkusProdModeTest()
        .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
            .addClasses(MyResource.class))
        .setRun(true);
    
    @Test
    public void testProductionBuild() {
        // Test production mode functionality
    }
}

Native Build Test

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyResource.class))
    .setBuildNative(true)
    .setRun(true);

Test with Runtime Configuration

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .setRuntimeProperties(Map.of(
        "quarkus.log.level", "DEBUG",
        "app.environment", "test"
    ))
    .setJVMArgs(List.of("-Xmx512m", "-Dfile.encoding=UTF-8"));

Test with Build Chain Customization

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .addBuildChainCustomizerEntries(new QuarkusProdModeTest.BuildChainCustomizerEntry(
        MyBuildStep.class,
        List.of(MyBuildItem.class),
        List.of(ApplicationArchivesBuildItem.class)
    ));

public static class MyBuildStep extends ProdModeTestBuildStep {
    public MyBuildStep(Map<String, Object> testContext) {
        super(testContext);
    }
    
    @Override
    public void execute(BuildContext context) {
        // Custom build logic
    }
}

Test with Process Control

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .setRun(false); // Build only, don't run

@Test
public void testBuildOnly() {
    // Application is built but not started
    // Can examine build artifacts, logs, etc.
}

@Test
public void testManualLifecycle() {
    // Manual control over application lifecycle
    config.start();
    
    // Test running application
    // ...
    
    config.stop();
}

Test with Exception Handling

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(FailingService.class))
    .assertBuildException(throwable -> {
        assertTrue(throwable.getMessage().contains("Expected build failure"));
    });

Test with Exit Handling

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(ExitingService.class))
    .setExpectExit(true);

@Test
public void testApplicationExit() {
    // Test applications that exit normally
    int exitCode = config.getExitCode();
    assertEquals(0, exitCode);
}

Test with Console Output Verification

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(LoggingService.class))
    .setRun(true);

@Test
public void testConsoleOutput() {
    String output = config.getStartupConsoleOutput();
    assertTrue(output.contains("Application started successfully"));
}

Test with Custom Resources

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .addCustomResourceEntry(
        Paths.get("target/custom-config"), 
        "META-INF/custom-config.yaml"
    );

Test with Configuration Override

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .withConfigurationResource("prod-test-application.properties")
    .overrideConfigKey("quarkus.http.port", "8081")
    .setCommandLineParameters(new String[]{"--config", "custom.properties"});

Test with Forced Dependencies

@RegisterExtension
static final QuarkusProdModeTest config = new QuarkusProdModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .setForcedDependencies(List.of(
        Dependency.of("org.example", "test-extension", "1.0.0")
    ));

Install with Tessl CLI

npx tessl i tessl/maven-io-quarkus--quarkus-junit5-internal

docs

build-chain-customization.md

dev-mode-testing.md

index.md

logging-test-resources.md

prod-mode-testing.md

results-utilities.md

unit-testing.md

tile.json