Интеграционное тестирование на основе модулей Spring-Boot
У меня есть многомодульный проект Spring-Boot. Мне было интересно, как я могу настроить интеграционное тестирование только для тестирования репозиториев Spring Data JPA? Следующий подход не работает с этим исключением: HV000183: Невозможно загрузить 'javax.el.ExpressionFactory'. Убедитесь, что у вас есть EL-зависимости от пути к классам.
Поскольку этот модуль не зависит от веб-модуля, не существует веб-приложения, которое можно запустить.
@RunWith(SpringJUnit4ClassRunner.class)
@IntegrationTest
@SpringApplicationConfiguration(classes = TestConfiguration.class)
class CardInfoRepositoryIT {
@Autowired CardInfoRepository cardInfoRepository;
@Test
void testLoadData() {
assert cardInfoRepository.findAll().size() == 1
}
}
2 ответа
Как сказал Мартен, @IntegrationTest
следует использовать только в том случае, если необходимо выполнить тестирование на развернутое приложение Spring Boot (например, развернутое во встроенном контейнере Tomcat, Jetty или Undertow). Поэтому, если ваша цель состоит в том, чтобы протестировать свой уровень хранилища изолированно, вам не следует использовать @IntegrationTest
,
С другой стороны, если ваши тесты требуют определенных функциональных возможностей Spring Boot (в отличие от стандартных функциональных возможностей, семантики и значений по умолчанию Spring Framework), вы на самом деле захотите аннотировать свой тестовый класс с помощью @SpringApplicationConfiguration
вместо @ContextConfiguration
, Причина в том, что @SpringApplicationConfiguration
предварительно настраивает SpringApplicationContextLoader
что характерно для Spring Boot.
Кроме того, если вы хотите, чтобы тесты интеграции уровня репозитория выполнялись быстрее (т. Е. Без полной загрузки Spring Boot), вы можете исключить классы конфигурации, помеченные знаком @EnableAutoConfiguration
так как это автоматически настроит каждого кандидата для автоконфигурации, найденного в пути к классам. Так, например, если вы просто хотите, чтобы Spring Boot автоматически настраивал встроенную базу данных и Spring Data JPA (с Hibernate в качестве поставщика JPA) вместе со сканированием сущностей, вы можете составить свою тестовую конфигурацию примерно так:
@Configuration
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
@EntityScan(basePackageClasses = User.class)
@Import({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
public class TestRepositoryConfig {}
А затем используйте эту конфигурацию в своем тестовом классе следующим образом:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestRepositoryConfig.class)
@Transactional
public class UserRepositoryTests { /* ... */ }
С Уважением,
Сэм
ps Мой ответ на следующий связанный вопрос может оказаться полезным: Отключите защиту для модульных тестов с пружинной загрузкой.
Я решил это, имея следующий тестовый конфигурационный класс.
@Configuration
@EnableAutoConfiguration
@ComponentScan
@PropertySource("classpath:core.properties")
class TestConfiguration {
}
core.properties также используется основным приложением и содержит информацию об источнике данных. Аннотация @IntegrationTest может быть удалена в тестовом классе.
Я также добавил в модуль следующее как зависимости:
testRuntime 'javax.el:javax.el-api:2.2.4'
testRuntime 'org.glassfish.web:javax.el:2.2.4'