@SpringBootTest не использует свойства теста - PullRequest
2 голосов
/ 05 мая 2020

Я использую jasypt для шифрования application.properties в приложении Spring Boot. Моя цель - обновить мои интеграционные тесты, чтобы jasypt использовался с паролем тестового шифратора. Моя проблема в том, что мой тест не отменяет свойства теста.

Зависимости:

        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>de.flapdoodle.embed</groupId>
            <artifactId>de.flapdoodle.embed.mongo</artifactId>
            <scope>test</scope>
        </dependency>

У меня есть два application.properties, одно в src / main / resources / application.properties и другое в src / test / application- test.properties. В свойстве test я устанавливаю jasypt.encryptor.password = test и заменяю spring.data.mongodb.uri значением jasypt EN C, используя тестовый пароль. Мой тест выглядит так:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;


@ExtendWith(SpringExtension.class)
@SpringBootTest
@ActiveProfiles("test")
@TestPropertySource("classpath:application-test.properties")
public class SpringBootAppTest{


    @Test
    public void shouldLoadContext(){
        //nothing to test
    }
}

Как видите, я использую JUnit5 для моего теста Spring Boot. Я пробовал несколько способов написать этот тест с настраиваемыми свойствами теста, но получаю одно и то же исключение:

Unable to decrypt: ENC(JsHRQaQN0cuHgrq/0o ...)

Значение - это значение свойства spring.data.mongodb.uri из src / main / resources /application.properties не значение из application-test.properties. Что я делаю не так и как мне заменить свои «основные» свойства на свойства теста?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Есть несколько способов переопределить исходный файл properties для тестирования, но при любом подходе вы должны поместить его в src/test/resources каталог

Переопределение файла свойств

Теперь мы переопределим свойства, поместив файл свойств в тестовые ресурсы. Этот файл должен находиться в том же пути к классам, что и путь по умолчанию.

Кроме того, он должен содержать все ключи свойств, указанные в файле по умолчанию. Поэтому мы добавим файл application.properties в src / test / resources:

Spring Profiles

В этом разделе мы узнаем, как решить нашу проблему с помощью профилей Spring. В отличие от предыдущего метода, этот объединяет свойства из файла по умолчанию и профилированного файла.

Во-первых, давайте создадим файл application–test.properties в src / test / resources:

0 голосов
/ 05 мая 2020

Измените

@TestPropertySource("classpath:application-test.properties")

на

@TestPropertySource(locations="classpath:application-test.properties")

с @RunWith(SpringRunner.class) в вашем тестовом классе

Если это не сработает, вот основной подход

Используйте @TestPropertySource на уровне class. По умолчанию эта аннотация пытается загрузить файл свойств относительно класса, объявившего аннотацию.

В вашем случае, например, если наш тестовый класс находится в пакете com.kunal.testpropertysource, тогда мы ' Мне понадобится файл com / kunal / testpropertysource / DefaultTest.properties в нашем пути к классам.

Давайте добавим его в нашу папку ресурсов, затем:

# DefaultTest.properties
kunal.testpropertysource.one=default-value

Кроме того, мы можем изменить файл конфигурации по умолчанию местоположение, или добавьте дополнительные свойства, которые будут иметь еще более высокий приоритет:

@TestPropertySource(locations = "/other-location.properties",
  properties = "kunal.testpropertysource.one=other-property-value")
...