2016-08-25 5 views
4

У меня есть следующие приложения Spring загрузки (с помощью Eureka и симулировать):@DataJpaTest терпит неудачу при использовании Эврика/Feign

@SpringBootApplication 
@EnableFeignClients 
@EnableRabbit 
@EnableDiscoveryClient 
@EnableTransactionManagement(proxyTargetClass = true) 
public class EventServiceApplication { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(EventServiceApplication.class, args); 
    } 
} 

и следующий тест, аннотированный с @SpringJpaTest:

@RunWith(SpringRunner.class) 
@DataJpaTest(showSql = true) 
public class EventRepositoryTest { 

    @Autowired 
    private TestEntityManager entityManager; 

    @Autowired 
    private EventRepository repository; 

    @Test 
    public void testPersist() { 
     this.entityManager.persist(new PhoneCall()); 
     List<Event> list = this.repository.findAll(); 

     assertEquals(1, list.size()); 
    } 
} 

Во время выполнения теста я получаю следующее сообщение об ошибке:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.netflix.discovery.EurekaClient] found for dependency [com.netflix.discovery.EurekaClient]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {} 

Полный StackTrace here

Есть ли способ решить эту проблему? Я видел, что это вызвано аннотациями @EnableFeignClients и @EnableDiscoveryClient.

ответ

3

Наконец мне удалось решить мою проблему следующим образом:

  1. Добавлено bootstrap.yml со следующим содержанием:

    eureka: 
        client: 
        enabled: false 
    spring: 
        cloud: 
        discovery: 
         enabled: false 
        config: 
         enabled: false 
    
  2. Я написал тестовую конфигурацию и ссылки его в Тест:

    @ContextConfiguration(classes = EventServiceApplicationTest.class) 
    

    где EventServiceApplicationTest является:

    @SpringBootApplication 
    @EnableTransactionManagement(proxyTargetClass = true) 
    public class EventServiceApplicationTest {} 
    

Я не знаю, если есть простой способ, но это работает.

0

Так как я предполагаю, что вы только намерены протестировать хранилище слой, можно отфильтровать ненужные бобы из ваших ApplicationContext, связанных с Feign и т.д.

можно настроить исключить фильтр через атрибут excludeFilters от @DataJpaTest.

Подробнее об фильтрах можно найти в Spring Reference Manual.

Другим вариантом было бы, чтобы отключить автоматическую конфигурацию симулировать и т.д. - в этом случае вы могли бы найти этот ответ полезным: Disable security for unit tests with spring boot

+0

У вас есть пример? –

+0

Я обновил свой ответ с помощью дополнительных ссылок и комментариев относительно отключения автоматической настройки. –

+0

Фактически @DataJpaTest автоматически отключает автоконфигурацию, как указано [здесь] (http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTest .html), поэтому отключить Feign, Eureka не требуется. Я обновил сообщение с полной трассировкой стека.Спасибо за вашу помощь в любом случае. –

1

У меня была аналогичная проблема с @EnableDiscoveryClient.

Я думаю, что в таких случаях самый простой подход положить отключение информации:

eureka: 
    client: 
    enabled: false 

в src/test/resources/application.[properties|yml]. Затем во время испытаний эта конфигурация имеет более высокий приоритет, чем src/main/resources/application.[properties|yml].