A runner for unit tests, intended for testing Quarkus rather than for end user consumption.
—
The QuarkusDevModeTest class provides black-box testing capabilities for Quarkus development mode, including file modification support, hot reload testing, and build system integration.
public class QuarkusDevModeTest implements BeforeAllCallback, AfterAllCallback,
BeforeEachCallback, AfterEachCallback, TestInstanceFactory {
public QuarkusDevModeTest();
}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);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);Configure code generation sources:
public QuarkusDevModeTest setCodeGenSources(String... codeGenSources);Configure logging behavior:
public QuarkusDevModeTest setLogFileName(String logFileName);
public QuarkusDevModeTest setLogRecordPredicate(Predicate<LogRecord> predicate);
public List<LogRecord> getLogRecords();
public void clearLogRecords();Configure build system properties:
public QuarkusDevModeTest setBuildSystemProperty(String name, String value);Handle command line arguments:
public String[] getCommandLineArgs();
public QuarkusDevModeTest setCommandLineArgs(String[] commandLineArgs);Configure failure handling behavior:
public boolean isAllowFailedStart();
public QuarkusDevModeTest setAllowFailedStart(boolean allowFailedStart);public static final OpenOption[] OPEN_OPTIONS;Default file open options used for file operations.
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
}
}@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
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
// ...
}@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
.withApplicationRoot(jar -> jar.addClasses(MyService.class))
.withTestArchive(testJar -> testJar.addClasses(TestResource.class));@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
.withApplicationRoot(jar -> jar.addClasses(MyService.class))
.setCodeGenSources("src/main/proto", "src/main/avro");@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
.withApplicationRoot(jar -> jar.addClasses(MyService.class))
.setBuildSystemProperty("maven.compiler.source", "17")
.setBuildSystemProperty("maven.compiler.target", "17");@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
.withApplicationRoot(jar -> jar.addClasses(MyService.class))
.setCommandLineArgs(new String[]{"--debug", "--verbose"});@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();
}@RegisterExtension
static final QuarkusDevModeTest config = new QuarkusDevModeTest()
.withApplicationRoot(jar -> jar.addClasses(FailingService.class))
.setAllowFailedStart(true);
@Test
public void testFailureRecovery() {
// Test recovery from startup failures
// ...
}// 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"
));// 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