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 для загрузки свойств из?
Ответы
Ответ 1
мы можем использовать @TestPropertySource
или @PropertySource
для загрузки файла свойств
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:properties.yml")
@ActiveProfiles("test")
public class DuurzaamApplicationTests {
@Test
public void contextLoads() {
}
}
Документы: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html.
Ответ 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
, вас немного удивит.