2015-02-06 1 views
1

Как следовать до Is there any way to conditionally ignore a test with JUnit of Spring?, если я хочу сделать это с @IfProfileValue@IfProfileValue импорта набор из окр переменной, тест не выполняется

@RunWith(SpringJUnit4ClassRunner.class) 
... 

@Resource ConfigurableEnvironment env; 

@Before 
public void env() { 
    log.debug("profiles {} {}", env.getDefaultProfiles(), env.getActiveProfiles()); 
} 

@Test 
@IfProfileValue(name = "integration") 
public void testExecute() throws JobExecutionException 
{...} 

выход журнала является profiles [default] [integration], но testExecute игнорируется то, что Мне не хватает, чтобы этот тест запускался, когда я включаю интеграцию. В настоящее время я разрешаю это, установив SPRING_PROFILES_ACTIVE=integration в тестировщик IDEA.

ответ

1

Первый: вам нужно использовать SpringJUnit4ClassRunner и использовать версию junit> 4.9.

Название аннотации - это немного счетчик интуитивно понятен: он проверяет значение ключа от ProfileValueSource. По умолчанию только источник SystemProfileValue настроен весной, обеспечивая доступ к свойствам системы.

Вы можете указать свой собственный ProfileValueSource, который проверяет, активен профиль, и настройте его для использования с помощью ProfileValueSourceConfiguration.

Если ваш вариант использования состоит в том, чтобы провести интеграционные тесты, и вы используете Maven, подумайте об использовании с помощью защищенного плагина и отдельных тестов, возможно, даже в другом модуле.

У меня есть короткий пример: из-за очень ранней фазы необходимо учитывать классы тестов, они будут работать только с системными свойствами. Поскольку вы заявили, что используете это в любом случае, вы можете быть довольны этим. Для реальных случаев (CI-сервер и т. Д.) Вы должны использовать более надежный подход, например, отказоустойчивый плагин и систему сборки, поддерживающие отдельные интеграционные тесты.

@RunWith(SpringJUnit4ClassRunner.class) 
@ProfileValueSourceConfiguration(ProfileTest.ProfileProfileValueSource.class) 
@SpringApplicationConfiguration(classes = ProfileTest.class) 
//won't work since not added to system properties! 
//@ActiveProfiles("integration") 
public class ProfileTest 
{ 

@Test 
public void contextLoads() 
{ 
} 

@IfProfileValue(name = "integration", value = "true") 
@Test 
public void runInIntegration() 
{ 
    throw new RuntimeException("in integration"); 
} 

@Test 
public void runDemo() 
{ 
    System.out.println("DEMO, running always"); 
} 

public static class ProfileProfileValueSource implements ProfileValueSource 
{ 
    @Override 
    public String get(String string) 
    { 
     final String systemProfiles = System.getProperty("spring.profiles.active", System.getProperty("SPRING_PROFILES_ACTIVE", "")); 

     final String[] profiles = systemProfiles.split(","); 

     return Arrays.asList(profiles).contains(string) ? "true" : null; 
    } 

} 
} 
+0

Я должен был использовать '... .getEnv («SPRING_PROFILES_ACTIVE»), потому что собственность не видит существование/установить еще ?, но кроме того, что это работало. – xenoterracide

 Смежные вопросы

  • Нет связанных вопросов^_^