Spring загрузочные тесты - не удается найти свойства теста

У меня есть проект загрузки spring, и он отлично работает. Теперь я хочу написать тесты для своего приложения, и я столкнулся с некоторыми головными головками конфигурации.

Spring boot создал тестовый класс для меня под названием ApplicationTests. Это очень просто и выглядит так:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DuurzaamApplicationTests {
    @Test
    public void contextLoads() {
    }    
}

Теперь, когда я запускаю тесты, я получаю эту ошибку:

java.lang.IllegalArgumentException: Could not resolve placeholder 'company.upload' in value "${company.upload}"

У меня есть файл properties.yml в каталоге src/test/resources и по какой-то причине он не загружен. Я пробовал всевозможные аннотации из примеров в Интернете, и все же никто из них не работает.

Как я могу сказать spring загрузочным тестам использовать файл application.yml для загрузки свойств из?

Ответ 2

К моему удивлению, когда вы загружаете файлы свойств в Spring Boot Test, .yml не поддерживается. Это отмечено в документации, хотя и неявно.

По ссылке выше:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html

Поддерживаемые форматы файлов

Поддерживаются как традиционные, так и основанные на XML форматы файлов свойств - например, "classpath: /com/example/test.properties" или "file: /path/to/file.xml".

.yml не упоминается.

И после изменения моего .yml на .properties и перезаписи значений в форме xx.xx.xx=value пары ключ-значение могут быть прочитаны правильно.

Так странно.

Ответ 3

Для меня вышеупомянутые решения не работали, и любые переменные окружения все еще переопределяли свойства теста, определенные в @TestPropertySource, хотя https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features- external-config.html указывает, что этот источник должен иметь более высокий приоритет, чем переменные среды. Единственное решение, которое работало для меня, было вручную определить bean-компонент PropertyPlaceholderConfigurer в классе тестовой конфигурации и установить его с наивысшим приоритетом.

Это было с Spring Boot 1.5.15.RELEASE

@Configuration
@TestPropertySource(properties = "/application-test.properties")
@Slf4j
public class IntegrationTestConfiguration {

@Bean
public static PropertyPlaceholderConfigurer properties() {
    PropertyPlaceholderConfigurer ppc
          = new PropertyPlaceholderConfigurer();
    Resource[] resources = new ClassPathResource[]
          { new ClassPathResource( "/application-test.properties" ) };
    ppc.setLocations( resources );
    ppc.setIgnoreUnresolvablePlaceholders( true );
    ppc.setOrder( Ordered.HIGHEST_PRECEDENCE );

    return ppc;
}

/// ....

@RunWith( SpringRunner.class )
@ActiveProfiles( "test" )
@Import( IntegrationTestConfiguration.class )
@SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
public class MyTest {

Ответ 4

@PropertySource и @TestPropertySource не работают с YAML. Смотрите это.

Я тоже проверял это сам. Попробуйте создать 2 файла - *.yml и *.properties и убедитесь сами.

Чтобы заставить *.yml работать, большинство людей используют @SpringBootTest, но если это не то, что вы хотите, и вместо этого вы хотите использовать @ContextConfiguration, вас немного удивит.