2015-10-25 1 views
0

Часто у нас есть тесты и производственная среда, отличающаяся друг от друга. В зависимости от некоторых параметров конфигурации некоторые классы не обязательны для регистрации в качестве бобов в контейнере (при использовании пружины). Есть ли способ динамически пропускать такие классы из контекста приложения?Как исключить класс из Spring с помощью нового интерфейса условий?

+0

Почему вы не используете механизм, доступный из коробки: профили? – kryger

ответ

0

Использование Spring 4 @ Консольная аннотация мы можем.

Проверить here для деталей интерфейса Spring Состояния

Сначала нужно создать класс сказать- «ComponentScanCondition, который реализует в Spring„состояние“интерфейс. И единственный метод„спички“возвращает ложь, если системное свойство не является нулевым или это среда «тест».

public class ComponentScanCondition implements Condition{ 

@Override 
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metaData) { 

    return System.getProperty("environment")!=null && System.getProperty("environment").equals("test")? false:true; 

} 


} 

Теперь с annotation- @Conditional (ComponentScanCondition.class) вы можете контролировать компонент сканирования на классы не нужно в тестовой среде.

В тесте JUnit класса, установить системное свойство, как показано ниже:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
public class testMyClass{ 

@BeforeClass 
public static void setUpBeforeClass() throws Exception{ 
    System.setProperty("environment", "test"); 
} 

@Test 
public void testSomeMethod(){ 

} 


} 

И в классах, не требуется в тесте, используйте @Conditional аннотации .Для если вам не нужен класс UserProfile в тестовой среде , пропустите его, как показано ниже:

@service("userProfile") 
@Conditional(ComponentScanCondition.class) 
public class UserProfile{ 

} 

как и в тестовом классе «окружающей среды» системное свойство имеет значение «тест», соответствует метод возвращает ложь и весна будет пропускать класс UserProfile для сканирования.

В проде среде это свойство не будет установлены и будет нулевым, так матчи будут возвращать истинный и, следовательно, UserProfile (и тот класс с @Conditional) будет сканироваться Spring для регистрации в качестве бобов в контейнере.

0

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

@Primary - особенность весны, которая намного старше, чем условия, и менее мощная, но она очень проста в использовании. Говорит: когда точка впрыска могла быть выполнена с двумя компонентами, тогда используйте компонент, который аннотируется @Primary, вместо этого генерируя исключение, которое жалуется на неоднозначные бобы.

Итак, когда вы добавляете компонент в область проверки с аннотацией @Primary, этот компонент заменяет исходный компонент в точках его впрыска.

+0

Вы также можете установить основной флаг в xml. – Ralph

+0

@ Steer360; Пожалуйста, прочтите мой ответ еще раз, особенно первый абзац. – Ralph

+0

Я читал. Я не могу заменить введенный класс. Требуются введенные классы. И если для теста я должен комментировать @Primary, тогда, когда он будет в процессе производства, мне нужно будет удалить эту аннотацию из класса ?. Моя цель состоит в том, чтобы сделать его динамически, независимо от того, что я комментирую, должен работать без проблем как для prod, так и для теста. пожалуйста, порекомендуйте. – Steer360

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