Тесты, которые запускают пружинную загрузку, должны быть тщательно разработаны
Существует целая среда тестирования для весенних загрузочных тестов, поэтому, очевидно, рассмотрите возможность использования этой среды.
Когда дело доходит до управления конфигурацией, я предлагаю рассмотреть следующее:
Существует два типа тестов:
- Тесты, которые загружают конкретную конкретную конфигурацию (набор компонентов), например, если вы хотите проверить только DAO, вы загружаете конфигурацию для этого dao.
В этом случае конфигурация должна быть «адаптирована» к потребностям конкретного теста, и «полная» конфигурация не требуется.
Например, если микросервис содержит конфигурацию для базы данных (пользователя, пароля, схемы и т. Д.) И, например, для управления сообщениями, нет необходимости указывать конфигурацию системы обмена сообщениями при тестировании DAO, обмена сообщениями бобы все равно не будут загружены.
Обычно тест этого «типа» будет выглядеть так:
@SpringBootTest(classes = {RelationalDbDaoConfiguration.class})
public class MyDaoTest {
}
Если у вас нет конфигурации для ваших нужд, вы можете использовать @MockBean
, чтобы смоделировать ненужные компоненты или даже создать пользовательскую конфигурацию в src/test/java
, чтобы она была только в тестовом пути к классам. Имеет смысл использовать @TestConfiguration
, но это выходит за рамки вопроса.
Теперь, чтобы загрузить конфигурацию только для БД, существует множество опций, если назвать несколько:
@ ActiveProfiles ("dao") на тестовом классе + добавление "application-dao.properties/yaml" в src/test/resources
или src/test/resources/config
Использование @TestPropertySource(locations = "classpath:whatever.properties")
при тестировании
Создайте специальный компонент "DbProperties" и инициализируйте его программно весной, это может иметь смысл, если вы знаете некоторые подробности о контексте, в котором тест выполняется только во время фактического выполнения теста (например, если вы запускаете база данных перед тестом, и порт создается динамически, но это действительно довольно сложная настройка и выходит за рамки этого вопроса) + компонент источника данных может прочитать эти свойства
Используйте атрибут @SpringBootTest
'properties
, чтобы предоставить определения «мелкозернистых» свойств
Вроде бы очевидно, но я все равно упомяну об этом: поместите application.properties
в src/test/resources
, он переопределит обычные конфигурации
Второй тип тестов - это когда вы загружаете "весь" микросервис, обычно это тесты, которые не имеют параметра "классы" в @SpringBootTest
аннотации
@SpringBootTest // note, no actual configurations specified
public class MyMicroserviceTest {
...
}
Теперь, это определенно требует указания целого набора конфигураций, хотя методы для фактического указания этих конфигураций по-прежнему применимы (только содержимое файлов конфигурации будет другим).
Я не предлагаю использовать spring.config.location во время теста, потому что это означает, что тест зависит от некоторого внешнего ресурса, что делает всю настройку еще более сложной.