2016-12-14 2 views
1

Я использую Spring Boot 1.4.2.Тест на весну и веб-интеграцию с аннотацией @ConditionaOnProperty

У меня есть служба аннотированный следующим

@Service 
@ConditionalOnProperty("${my.property.enabled:false}") 
public class MyService { 

} 

и я хочу, чтобы проверить его делающие интеграционные тесты, например,

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT) 
public class MyServiceTest { 

    @Autowired 
    private MyService myService; 

} 

В тесте не проходит аутсорсинг. Я хочу избежать установки свойства в файле свойств внутри тестовой папки. Не могу ли я включить свойство непосредственно через такую ​​аннотацию внутри MyServiceTest?

+0

Это поможет точно узнать, чего вы пытаетесь достичь. Лучше всего просто иметь класс '@ Configuration' для этого теста, который определенно объявляет' @Bean MyService' безоговорочно. – chrylis

+0

Этот подход кажется интересным. Как я могу выполнить определенную конфигурацию в MyServiceTest? –

+0

Я не уверен, как работает новая магия тестирования загрузки; Обычно я использую '@ ContextConfiguration'. Вы можете попробовать просто объявить (статический) «@ Configuration» вложенный класс на вашем тестовом классе и посмотреть, не поднял ли он его. – chrylis

ответ

1

Update

Как Стефан упомянул в комментариях свойства встраивание для тестирования целей, приведенных ниже может произойти в @SpringBootTest непосредственно через параметр properties в этом случае вам не нужно @TestPropertySource:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT, 
       properties = { "my.property.enabled = true" }) 
public class MyServiceTest { 

    @Autowired 
    private MyService myService; 

} 

Оригинал ответа

Вы можете встраивать необходимые свойства в тестовом классе конфигурации непосредственно с помощью @TestPropertySource:

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT) 
@TestPropertySource(properties = { "my.property.enabled = true" }) 
public class MyServiceTest { 

    @Autowired 
    private MyService myService; 

} 

отметить также, что аннотацию, как вы определили, что не будет работать, может быть, вы имели в виду использовать @ConditionalOnExpression в этом случае он будет работать:

@Service 
@ConditionalOnExpression("${my.property.enabled:false}") 
public class MyService { 

} 

@ConditionalOnProperty но более выразительна и в вашем случае можно записать в виде:

@Service 
@ConditionalOnProperty(prefix="my.property" , name = "enabled", havingValue = "true") 
public class MyService { 

} 
+2

Возможно, вы могли бы обновить свой ответ, указав, что 'SpringBootTest' имеет ярлык' properties' для этого. Так что это будет что-то вроде '@SpringBootTest (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties =" "my.property.enabled = true") ' –

+0

Спасибо Стефан, я обновлю свой ответ. – dimitrisli