I am covering my features in my new Quarkus REST API with tests. I am currently learning how to develop microservices using Quarkus and I am experimenting with Liquibase. This project includes working with H2 for testing and Liquibase. Quarkus dev works perfectly fine but when I am running tests I encounter these errors:
java.lang.RuntimeException: java.lang.RuntimeException: Failed to start quarkus
at io.quarkus.test.junit.QuarkusTestExtension.throwBootFailureException(QuarkusTestExtension.java:638)
at io.quarkus.test.junit.QuarkusTestExtension.interceptTestClassConstructor(QuarkusTestExtension.java:722)
at java.base/java.util.Optional.orElseGet(Optional.java:364)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.lang.RuntimeException: Failed to start quarkus
at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
at io.quarkus.runtime.Application.start(Application.java:101)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at io.quarkus.runner.bootstrap.StartupActionImpl.run(StartupActionImpl.java:285)
at io.quarkus.test.junit.QuarkusTestExtension.doJavaStart(QuarkusTestExtension.java:252)
at io.quarkus.test.junit.QuarkusTestExtension.ensureStarted(QuarkusTestExtension.java:605)
at io.quarkus.test.junit.QuarkusTestExtension.beforeAll(QuarkusTestExtension.java:655)
... 1 more
Caused by: java.lang.IllegalStateException: Error starting Liquibase
at io.quarkus.liquibase.runtime.LiquibaseRecorder.doStartActions(LiquibaseRecorder.java:90)
at io.quarkus.deployment.steps.LiquibaseProcessor$startLiquibase1744275855.deploy_0(Unknown Source)
at io.quarkus.deployment.steps.LiquibaseProcessor$startLiquibase1744275855.deploy(Unknown Source)
... 8 more
Caused by: jakarta.enterprise.inject.CreationException: Error creating synthetic bean [1d48OwssPZoQytD2p8kGRAP54yY]: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unable to find datasource '<default>' for Liquibase: Datasource '<default>' is not configured. To solve this, configure datasource '<default>'. Refer to https://quarkus.io/guides/datasource for guidance.
at io.quarkus.liquibase.LiquibaseFactory_1d48OwssPZoQytD2p8kGRAP54yY_Synthetic_Bean.doCreate(Unknown Source)
at io.quarkus.liquibase.LiquibaseFactory_1d48OwssPZoQytD2p8kGRAP54yY_Synthetic_Bean.create(Unknown Source)
at io.quarkus.liquibase.LiquibaseFactory_1d48OwssPZoQytD2p8kGRAP54yY_Synthetic_Bean.create(Unknown Source)
at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:119)
at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:38)
at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:35)
at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.c18(Unknown Source)
at io.quarkus.arc.generator.Default_jakarta_enterprise_context_ApplicationScoped_ContextInstances.computeIfAbsent(Unknown Source)
at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:35)
at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:21)
at io.quarkus.liquibase.LiquibaseFactory_1d48OwssPZoQytD2p8kGRAP54yY_Synthetic_ClientProxy.arc$delegate(Unknown Source)
at io.quarkus.liquibase.LiquibaseFactory_1d48OwssPZoQytD2p8kGRAP54yY_Synthetic_ClientProxy.getConfiguration(Unknown Source)
at io.quarkus.liquibase.runtime.LiquibaseRecorder.doStartActions(LiquibaseRecorder.java:65)
... 10 more
Caused by: jakarta.enterprise.inject.UnsatisfiedResolutionException: Unable to find datasource '<default>' for Liquibase: Datasource '<default>' is not configured. To solve this, configure datasource '<default>'. Refer to https://quarkus.io/guides/datasource for guidance.
at io.quarkus.liquibase.runtime.LiquibaseRecorder$1.apply(LiquibaseRecorder.java:42)
at io.quarkus.liquibase.runtime.LiquibaseRecorder$1.apply(LiquibaseRecorder.java:32)
at io.quarkus.liquibase.LiquibaseFactory_1d48OwssPZoQytD2p8kGRAP54yY_Synthetic_Bean.createSynthetic(Unknown Source)
... 23 more
Caused by: io.quarkus.runtime.configuration.ConfigurationException: Datasource '<default>' is not configured. To solve this, configure datasource '<default>'. Refer to https://quarkus.io/guides/datasource for guidance.
at io.quarkus.datasource.common.runtime.DataSourceUtil.dataSourceNotConfigured(DataSourceUtil.java:47)
at io.quarkus.liquibase.runtime.LiquibaseRecorder$1.apply(LiquibaseRecorder.java:39)
... 25 more
I tried running the tests using the IntelliJ Idea and by quarkus test into the terminal. The result is always the same.
My project\src\test\resources folder:
application-dev.yml: (it's the same in the src\main\resources and it's working in dev mode)
quarkus:
datasource:
db-kind: h2
username: sa
password: password
jdbc:
driver: org.h2.Driver
url: jdbc:h2:file:./database;AUTO_SERVER=true;DB_CLOSE_DELAY=-1;
liquibase:
migrate-at-start: false
hibernate-orm:
log:
sql: true
database:
generation: drop-and-create
scripts:
generation:
create-target: dev-changelog/release-1.0/migrations/schema-1.sql
drop-target: dev-changelog/release-1.0/migrations/drop-1.sql
sql-load-script: dev-changelog/release-1.0/migrations/level-1.sql
An example of a test class:
@QuarkusTest
public class LevelResourceTest {
@Test
public void testPostRequest() {
//REST ASSURED TEST
}
}
I tried adding more dependencies to pom.xml that could be related but it kept the same problem. I tried my configuration by changing the URL of the H2 DB. And I couldn't find anyone with a similar problem on the net. Reloading, maven clean install, and rebooting everything also didn't help.
Its expected behavior is obviously to run the test. My previous project works with pretty much the same configurations without any trouble.
I found the solution. The problem is that Quarkus runs tests using application.yml, not application-dev.yml. So I just renamed the application-dev into the application. Now it works. But for some reason, my other project runs tests using application-dev.