2017-01-13 6 views
4

У меня есть Spring Boot 1.4.3 проект. В папке test/resources у меня есть два файла свойств, скажем a-test.properties и b-test.properties.Spring Boot загружает все доступные файлы свойств независимо от моей аннотации @TestPropertySource

Класс тест помечается следующим образом:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@TestPropertySource(locations = "classpath:a-test.properties") 

Однако, я вижу в моем тесте, что и свойства от b-test.properties нагружены (я проверил это с помощью простого вывода на печать).

Почему? Как я могу это предотвратить?


Пример извлекается из моего теста

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
@TestPropertySource(locations = "classpath:base-test.properties", inheritProperties=false) 
public class EmailServiceContextBasedTest { 

    @SpyBean 
    public JavaMailSender javaMailSender; 

    @Before 
    public void setUp() throws Exception { 

     System.out.println(
      ((JavaMailSenderImpl)javaMailSender).getPassword() 
     ); 
     System.out.println(
      ((JavaMailSenderImpl)javaMailSender).getJavaMailProperties() 
     ); 
    } 


    @Test 
    public void test() throws Exception { 
     // do nothing 
    } 

} 

, где находится a-test.properties:

spring.mail.host=smtp.gmail.com 
spring.mail.port=587 
[email protected] 
spring.mail.password=password 
spring.mail.properties.mail.smtp.auth=false 
spring.mail.properties.mail.smtp.starttls.enable=false 

и b-test.properties

spring.mail.host=smtp.gmail.com 
spring.mail.port=587 
[email protected] 
spring.mail.password=myPassword 
spring.mail.properties.mail.smtp.auth=true 
spring.mail.properties.mail.smtp.starttls.enable=true 
+1

Как вы прочитали недвижимость? Можете ли вы добавить код, демонстрирующий поведение, которое вы описываете? – dimitrisli

+0

@ dimitrisli да, конечно! Я прикрепил пример –

+0

@mat_boy Просьба предоставить вывод, который вы получаете, и ожидаемый результат. Ваш пример будет печатать только пароль, связанный с одним из файлов свойств (в моем случае это 'a-test.properties'). Итак, как вы проверили 'то, что загружаются свойства из b-test.properties' ?! – Omid

ответ

0

Я нашел источник проблемы.

я имел в тестовой папке класс определяется как в следующем

@SpringBootApplication 
@EnableAutoConfiguration 
@PropertySource("classpath:a-test.properties") 
public class TestApplication { 

    public static void main(final String... args) { 
     SpringApplication.run(TestApplication.class, args); 
    } 
} 

Это не был назван в тесте, но я предполагаю, что был экземпляр по умолчанию, Spring ботинке при выполнении тестов в классе DefaultEmailServiceContextBasedTest с аннотацией

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 

Итак, проблема в том, что я использовал @PropertySource. Я не знаю, почему, но заменив эту аннотацию @TestPropertySource, решил проблему конфликта.

3

С SpringBootTest аннотации он автоматически установит конфигурацию приложения весенней загрузки, относящуюся к документам

Аннотация, которые могут быть указаны в тестовом классе, который запускает тесты на основе Spring Boot. Предоставляет следующие возможности сверх обычной Spring Framework TestContext:

  • Использует SpringBootContextLoader в ContextLoader по умолчанию, если нет конкретных @ContextConfiguration (Загрузчик = ...) не определено.
  • Автоматически ищет @SpringBootConfiguration, когда вложенная @Configuration не используется, и явные классы не указаны.
  • Позволяет определить настраиваемые свойства среды с помощью атрибута properties.
  • Обеспечивает поддержку различных режимов webEnvironment, включая возможность запуска полностью запущенного контейнера, прослушивающего определенный или случайный порт.
  • Регистрирует компонент TestRestTemplate для использования в веб-тестах, которые используют полностью запущенный контейнер.

Так что я полагаю, вы загружаете другие свойства в другом месте, но на самом деле это @TestPropertySource(locations = "classpath:a-test.properties", inheritProperties=false) будет загружать только a-test.properties действительно.

Вот простой тест:

  • с a-test.properties enter image description here
  • с b-test.properties enter image description here

И @TestPropertySource annotat ион, вы все еще получаете изменения, чтобы переопределить свойства, прежде чем тесты выполняются с properties атрибутами,

Для вас проблемы, вы можете overrride это как @TestPropertySource(locations = "classpath:b-test.properties", properties = {"spring.mail.host=smtp.gmail.com", "spring.mail.port=587", "s[email protected]" ......})

0

Вы смешиваете аннотации уровня приложения с тестовыми аннотациями.

@SpringBootApplication представляет собой аннотацию уровня приложения и может использоваться только с аннотацией @PropertySource.

Таким образом, замена @PropertySource на @TestPropertySource аналогична отсутствию аннотации.

Вам нужно будет исправить свою структуру.

Переместить класс аннотации @SpringBootApplication в основной пакет и добавить обратно @PropertySource аннотация.

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

Давайте предположим, что a-test.properties является ресурсом с @PropertySource для вашего приложения и b-test.properties это ресурс с @TestPropertySource для теста.

При запуске тестового класса с @TestPropertySource с b-test.properties он имеет приоритет перед любым другим файлом свойств, загруженным из пути класса.

При тестировании приложений Spring Boot это часто не требуется. Spring Boot's @ * Тестовые аннотации автоматически будут искать вашу основную конфигурацию , если вы ее явно не определяете.

алгоритм поиска работает по сравнению с пакетом, который содержит тест до тех пор, пока не найдет @SpringBootApplication или @SpringBootConfiguration аннотированный класса. Пока вы структурируете свой код в разумном способах, обычно обнаруживается ваша основная конфигурация.

Итак, ваш класс с @SpringBootApplication с webEnvironment загрузит встроенный контейнер для вашего теста.

Подробнее о том, как тестовая среда находит конфигурацию.

http://docs.spring.io/spring-boot/docs/1.4.0.M3/reference/htmlsingle/#boot-features-testing-spring-boot-applications-detecting-config

Вы можете использовать @SpringBootTest(classes=MyTestApplication.class), если вы хотите использовать специальные конфигурации для тестирования.

Подробнее здесь, в java-документах.

http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/context/SpringBootTest.html

0

Самый простой, чтобы делать то, что вам нужно, чтобы установить профиль такой:

@ActiveProfiles ("тест")

Тогда просто написать application-test.properties файл с заданными свойствами для запуска теста.