2015-01-24 14 views
4

У меня есть проект с несколькими модулями Spring-Boot. Мне было интересно, как я могу настроить интеграционное тестирование только для проверки хранилищ Spring Data JPA? При этом исключается следующий подход: HV000183: Не удается загрузить 'javax.el.ExpressionFactory'. Убедитесь, что у вас есть зависимости EL от пути к классам.Тестирование интеграции на основе модулей Spring-Boot

Поскольку этот модуль не зависит от веб-модуля, веб-приложение не может быть запущено.

@RunWith(SpringJUnit4ClassRunner.class) 
@IntegrationTest 
@SpringApplicationConfiguration(classes = TestConfiguration.class) 
class CardInfoRepositoryIT { 

    @Autowired CardInfoRepository cardInfoRepository; 

    @Test 
    void testLoadData() { 
     assert cardInfoRepository.findAll().size() == 1 
    } 

} 
+0

Вы должны использовать свой класс приложения в аннотации 'SpringApplicationConfiguration', а не какую-либо произвольную конфигурацию, которую вы создали. Также вам действительно нужен '@ Integrationtest'? Поскольку это запустит ваше приложение, чтобы вы могли использовать «RestTemplate» или что-то еще, чтобы протестировать ваше приложение. Это не то, что вы, кажется, делаете или нуждаетесь. –

+0

1) Я не могу использовать класс приложения, поскольку этот модуль зависит от веб-модуля (веб-модуль содержит класс приложения). 2) Зачем мне нужен RestTemplate для тестирования репозиториев? Это не тест интеграции сети или веб-сервиса. – led

+0

Вы действительно понимаете, что делает '@ IntegrationTest'? Судя по тому, что вы пытаетесь сделать, это не имеет никакого отношения к тесту интеграции в смысле Spring Boot. Вы просто пишете единичный тест для репозитория, а не интеграционный тест. –

ответ

11

Как уже упоминался Мартен, @IntegrationTest следует использовать только тогда, когда вам необходимо проверить против развернутого приложения Spring загрузки (например, развернутый во встроенном сервере Tomcat , Jetty или Undertow). Поэтому, если ваша цель - изолировать ваш слой репозитория, вы не должны использовать @IntegrationTest.

С другой стороны, если ваши тесты требуют определенной функциональности Spring Boot (в отличие от стандартных функциональных возможностей Spring Framework, семантики и значений по умолчанию), вы фактически хотите аннотировать свой тестовый класс с помощью @SpringApplicationConfiguration вместо @ContextConfiguration. Причина в том, что @SpringApplicationConfiguration предварительно сконфигурирует SpringApplicationContextLoader, который относится к Spring Boot.

Кроме того, если вы хотите, чтобы ваши хранилища интеграционные тесты уровня, чтобы работать быстрее (т.е. без полного погона Spring ботинке), вы можете выбрать, чтобы исключить классы конфигурации аннотированные с @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 { /* ... */ } 

с уважением,

Сэм

п.с. Вы также можете найти мой ответ на следующий, связанный с этим вопрос: Disable security for unit tests with spring boot

+0

Спасибо за подробное объяснение. Это то, что я хотел знать в первую очередь. – led

0

Я решил это, имея следующий тестовый конфигурационный класс.

@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'