Search code examples
springspring-bootspring-dataspring-testspring-test-dbunit

Configure specific in memory database for testing purpose in Spring


How do I configure my Spring Boot application so that when I run unit tests it will use in-memory database such as H2/HSQL but when I run Spring Boot application it will use production database PostgreSQL/MySQL ?


Solution

  • Spring profiles can be used for this. This would be a specific way:

    Have environment specific properties files:

    application.properties:

    spring.profiles.active: dev
    

    application-dev.properties

    spring.jpa.database: MYSQL
    spring.jpa.hibernate.ddl-auto: update
    
    spring.datasource.url: jdbc:mysql://localhost:3306/dbname
    spring.datasource.username: username
    spring.datasource.password: password
    

    application-test.properties

    spring.jpa.database: HSQL
    

    Have both MySQL and H2 drivers in pom.xml, like this:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <scope>test</scope>
    </dependency>
    

    Last but not the least, annotate Test classes with @ActiveProfiles("test").