Тесты в Spring Boot с базой данных H2

Я пытаюсь запустить тесты на Spring Boot api с базой данных H2 в тесте, однако при попытке запустить тесты система использует application.properties в основном ресурсе вместо теста. Я попытался назвать файл application-test.properties и использовать аннотацию @ActiveProfiles("test") в тестовом классе, но это не сработало (тестирование помещается в основной / ресурс, а затем в тест / ресурс). Теперь я не знаю, что попробовать.

Мой основной / ресурс / apllication.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/chamados
spring.datasource.username=root
spring.datasource.password=12345
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

Мой тест / ресурс / application.properties:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=

spring.h2.console.enabled=false

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true

Мой тестовый класс, который просто запускается:

@RunWith(SpringRunner.class)
@SpringBootTest
public class BackEndApplicationTests {

@Test
public void contextLoads() {
}

}

Мой pom.xml:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <jwt.version>0.9.1</jwt.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-test</artifactId>
        <scope>test</scope>
    </dependency>
        <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <scope>test</scope>
    </dependency>

        <!-- Autenticação -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${jwt.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

person user2831852    schedule 16.12.2018    source источник


Ответы (2)


Spring загружается сначала и всегда загружает application.properties, а затем, если существует application-{profile}. В этом случае последний переопределит некоторые свойства из родительского (application.properties). Дополнительные сведения см. В документации по весенней загрузке..

У вас должны быть main/resource/application.properties и test/resource/application-test.properties (не application.properties в тестовом каталоге) + @ActiveProfiles("test"). Тогда все заработает. Если вы думаете, что это не работает - проверьте путь к классам запущенного приложения. Например, идея + maven - целевой каталог; idea + gradle - каталог сборки.

person Artem Ptushkin    schedule 16.12.2018
comment
Вы сказали, что в этом случае последний будет переопределять некоторые свойства из родительского, и это было проблемой вместе с вопросом об имени applicationatio-test.properties. В приложении-тесте я не выставлял значение spring.datasource.driver-class-name, теперь работает. - person user2831852; 16.12.2018
comment
Для меня это была проблема. Поместил файл свойств для тестовой среды в папку main / resources /. Спасибо! - person vbknez; 18.07.2020

Создайте еще один файл приложения с именем application-test.properties со следующим содержимым в том же каталоге, только не нужно создавать в тестовом режиме:

spring.datasource.url = jdbc:h2:~/testdb;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.username = sa
spring.datasource.password = 
spring.datasource.driverClassName = org.h2.Driver

Затем добавьте к своим тестовым классам следующую аннотацию:

@ActiveProfiles("test")

Это будет работать, потому что при весенней загрузке у нас может быть несколько профилей, поэтому мы создаем один профиль с именем теста.

person Supreet Singh    schedule 16.03.2020
comment
Пожалуйста, постарайтесь правильно отформатировать части кода вашего ответа. - person dspencer; 16.03.2020