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

dev-mode-testing.mddocs/

Development Mode Testing

The QuarkusDevModeTest class provides black-box testing capabilities for Quarkus development mode, including file modification support, hot reload testing, and build system integration.

Core API

Basic Setup

public class QuarkusDevModeTest implements BeforeAllCallback, AfterAllCallback, 
    BeforeEachCallback, AfterEachCallback, TestInstanceFactory {
    
    public QuarkusDevModeTest();
}

Archive Configuration

Configure the application and test archives:

public Supplier<JavaArchive> getArchiveProducer();
public QuarkusDevModeTest setArchiveProducer(Supplier<JavaArchive> archiveProducer);
public QuarkusDevModeTest withApplicationRoot(Consumer<JavaArchive> applicationRootConsumer);
public QuarkusDevModeTest withEmptyApplication();
public QuarkusDevModeTest setTestArchiveProducer(Supplier<JavaArchive> testArchiveProducer);
public QuarkusDevModeTest withTestArchive(Consumer<JavaArchive> testArchiveConsumer);

File Operations

Modify source and resource files during testing:

public void modifySourceFile(String sourceFile, Function<String, String> mutator);
public void modifyFile(String file, Function<String, String> mutator);
public void modifySourceFile(Class<?> sourceFile, Function<String, String> mutator);
public void modifyTestSourceFile(Class<?> sourceFile, Function<String, String> mutator);
public void addSourceFile(Class<?> sourceFile);
public void modifyResourceFile(String path, Function<String, String> mutator);
public void modifyTestResourceFile(String path, Function<String, String> mutator);
public void addResourceFile(String path, String data);
public void addResourceFile(String path, byte[] data);
public void deleteResourceFile(String path);

Code Generation

Configure code generation sources:

public QuarkusDevModeTest setCodeGenSources(String... codeGenSources);

Logging Configuration

Configure logging behavior:

public QuarkusDevModeTest setLogFileName(String logFileName);
public QuarkusDevModeTest setLogRecordPredicate(Predicate<LogRecord> predicate);
public List<LogRecord> getLogRecords();
public void clearLogRecords();

Build System Integration

Configure build system properties:

public QuarkusDevModeTest setBuildSystemProperty(String name, String value);

Command Line Configuration

Handle command line arguments:

public String[] getCommandLineArgs();
public QuarkusDevModeTest setCommandLineArgs(String[] commandLineArgs);

Error Handling

Configure failure handling behavior:

public boolean isAllowFailedStart();
public QuarkusDevModeTest setAllowFailedStart(boolean allowFailedStart);

Constants

public static final OpenOption[] OPEN_OPTIONS;

Default file open options used for file operations.

Usage Examples

Basic Development Mode Test

import io.quarkus.test.QuarkusDevModeTest;
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 DevModeTest {
    
    @RegisterExtension
    static final QuarkusDevModeTest config = new QuarkusDevModeTest()
        .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
            .addClasses(MyResource.class));
    
    @Test
    public void testHotReload() {
        // Test hot reload functionality
    }
}

Test with File Modifications

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyResource.class));

@Test
public void testFileModification() {
    // Modify a source file and test hot reload
    config.modifySourceFile("org/example/MyResource.java", source -> 
        source.replace("Hello World", "Hello Universe"));
    
    // Test that changes are reflected
    // ...
}

Test with Resource File Changes

@Test
public void testResourceModification() {
    // Add a new resource file
    config.addResourceFile("config/app.properties", "key=value");
    
    // Modify existing resource
    config.modifyResourceFile("application.properties", content ->
        content + "\nnew.property=new-value");
    
    // Test resource changes
    // ...
}

Test with Multiple Archive Types

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .withTestArchive(testJar -> testJar.addClasses(TestResource.class));

Test with Code Generation

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .setCodeGenSources("src/main/proto", "src/main/avro");

Test with Build System Properties

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .setBuildSystemProperty("maven.compiler.source", "17")
    .setBuildSystemProperty("maven.compiler.target", "17");

Test with Command Line Arguments

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .setCommandLineArgs(new String[]{"--debug", "--verbose"});

Test with Logging Assertions

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
    .withApplicationRoot(jar -> jar.addClasses(MyService.class))
    .setLogRecordPredicate(record -> record.getLevel() == Level.INFO);

@Test
public void testLogging() {
    // Perform actions that generate logs
    // ...
    
    // Check logs
    List<LogRecord> logs = config.getLogRecords();
    assertTrue(logs.stream()
        .anyMatch(record -> record.getMessage().contains("Expected message")));
    
    // Clear logs for next test
    config.clearLogRecords();
}

Test with Failure Handling

@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
    .withApplicationRoot(jar -> jar.addClasses(FailingService.class))
    .setAllowFailedStart(true);

@Test
public void testFailureRecovery() {
    // Test recovery from startup failures
    // ...
}

File Operation Patterns

Simulating Code Changes

// Modify method implementation
config.modifySourceFile("org/example/MyService.java", source ->
    source.replace(
        "public String getMessage() { return \"Hello\"; }",
        "public String getMessage() { return \"Hello World\"; }"
    ));

// Add new method
config.modifySourceFile("org/example/MyService.java", source ->
    source.replace(
        "}\n$", // End of class
        "    public String getNewMessage() { return \"New\"; }\n}\n"
    ));

Managing Configuration Files

// Update application properties
config.modifyResourceFile("application.properties", props ->
    props + "\nquarkus.log.level=DEBUG");

// Add new configuration file
config.addResourceFile("META-INF/microprofile-config.properties", 
    "app.name=Test Application\napp.version=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