How to tell Spring Boot to use another DB for test?
I had application.properties in /src/main/java/resources with a data source configuration for the main application.
I added application-test.properties to /src/test/java/resources with a data source configuration to a database for testing. Additionally, I added @ActiveProfiles("test")
to the test that should use that database. Note that Spring configures itself using the word test in application-test.properties and in the annotation. As such, Spring "overwrites" the configuration of application.properties.
application.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/databasespring.datasource.username=userspring.datasource.password=secretspring.datasource.driverClassName=com.mysql.jdbc.Driver
application-test.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/database_testspring.datasource.username=userspring.datasource.password=secretspring.datasource.driver-class-name=com.mysql.jdbc.Driver
Though the question already has an answer.
We can also use @DataJpaTest
if you want to test JPA applications. By default it will configure an in-memory embedded database, scan for @Entity classes and configure Spring Data JPA repositories. Regular @Component beans will not be loaded into the ApplicationContext.
It is one of the testing improvements made in spring boot application.
Read Docs : https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html
The in-memory database is used by default on tests. You can disable that behavior and get it to use the application-configured database adding the annotation @AutoConfigureTestDatabase(replace = Replace.NONE)
to your tests (see Auto-configured Data JPA Tests).
You can then either add an application.properties
or equivalent to src/test/resources
or a separate application file such as application-test.properties
and make the tests use it by annotating them with @ActiveProfiles("test")
.