2016-03-15 1 views
0

Я несколько раз царапаю голову.Как инициализировать компонент с @RefreshScope из тестов интеграции Spring Boot?

Spring Cloud Netflix autoconfigures клиент Eureka. Следующий фрагмент из источников EurekaClientAutoConfiguration.

@Bean(destroyMethod = "shutdown") 
@ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT) 
@org.springframework.cloud.context.config.annotation.RefreshScope 
@Lazy 
public EurekaClient eurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, EurekaInstanceConfig instance) { 
    applicationInfoManager.getInfo(); // force initialization 
    return new CloudEurekaClient(applicationInfoManager, config, 
        this.optionalArgs, this.context); 
     } 

Этот компонент будет инициализирован только тогда, когда приложение Spring Boot запускает событие приложения.

Учитывая, что я запускаю интеграционные тесты JUnit, такого рода событий не произойдет.

Здесь модульного тестирования:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = ReferentialClientTest.class) 
public class InstrumentClientIT { 
    @Resource 
    private InstrumentClient instrumentClient; 

    @Test 
    public void testInstrumentClient() { 
     instrumentClient.findOne(455540l).getName(); 
    } 
} 

InstrumentClient является клиентом Фейн, который зависит от EurekaClient.

Вот тестовый класс конфигурации.

@EnableFeignClients 
@EnableDiscoveryClient 
@EnableAutoConfiguration 
public class ReferentialClientTest { 
    public static void main(String[] args) { 
     SpringApplication.run(ReferentialClientTest.class, args); 
    } 
} 

Как я могу убедиться, что EurekaClient правильно инициализирован без проводки его в мой интеграционный тест? (Это единственная работа, которую я нашел еще).

+0

Вы пытались аннотировать свой тестовый класс с помощью '@ WebAppConfiguration', он гарантирует, что Spring загрузит контекст веб-приложения для вашего теста. '@ SpringApplicationConfiguration' по-видимому не подразумевает это по умолчанию. Я мог ошибаться, поэтому я не представил это как реальный ответ. –

+0

И мы получили себя победителем! '@ WebAppConfiguration' не работал. Но '@ WebIntegrationTest' сделал трюк! Наконец, я могу понять эту аннотацию! Просто дайте объяснение ответа, и я его приму;) спасибо! –

ответ

3

Так как обнаружено, вам необходимо аннотировать свой класс @WebIntegrationTest.

+0

@WebIntegrationTest действительно был ответом. Ему удалось сгенерировать приложение applicationEvent, которое инициировало инициализацию Bean. Большое спасибо ! –

+0

Счастливый, я смог указать вам в правильном направлении :) –