2015-09-04 3 views
0

существующий проект, который я работаю, имеет Spring бина, которая создается с Java:Как можно использовать аннотированные бобы в junit?

@Configuration 
public class BeansConfiguration 
{ 
    @Autowired 
    private Environment environment; 

    @Bean(name = "edielbean") 
    public EdielBean edielBean() 
    { 
    return new EdielBean(); 
    } 
} 

Теперь я хочу, чтобы получить доступ к этому компоненту из моего модульного тестирования. Мой вопрос похож на How to access Spring context in jUnit tests annotated with @RunWith and @ContextConfiguration?, за исключением того, что мой компонент не в XML, а на Java.

Я попробовал, добавив этот тест единицы (верблюд часть можно пренебречь):

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class EdielBeanTest extends CamelTestSupport implements ApplicationContextAware { 

private ApplicationContext context; 

@Override 
public String isMockEndpoints() { 
    // camel 
    return "*"; 
} 

@Test 
public void testSupplierSwitch() throws Exception 
{ 
    getMockEndpoint("mock:market-out").expectedMessageCount(1); // camel 
    System.out.println("beans: "+context.getBeanDefinitionCount()); 
    for (String name: context.getBeanDefinitionNames()) { 
    System.out.println(name); 
    } 
    EdielBean edielBean = (EdielBean)context.getBean("edielbean"); 
    edielBean.startSupplierSwitch(createCustomer(), createOrder(), "54", "43"); 

    assertMockEndpointsSatisfied(); // camel 
} 

private Customer createCustomer() 
{ 
    Customer customer = new Customer(); 
    // .... part omitted  
    return customer; 
} 

private Order createOrder() { 
    Order order = new Order(); 
    // .... part omitted 
    return order; 
} 

@Override 
public void setApplicationContext(ApplicationContext context) 
    throws BeansException { 
    this.context = context; 
} 

} 

Консоль вывода показывает, что есть только тривиальные бобы:

... 
beans: 6 
org.springframework.context.annotation.internalConfigurationAnnotationProcessor 
org.springframework.context.annotation.internalAutowiredAnnotationProcessorSep 
org.springframework.context.annotation.internalRequiredAnnotationProcessor 
org.springframework.context.annotation.internalCommonAnnotationProcessor 
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor 
org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor 
... 

тест выход:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'edielbean' is defined 
    at 
    .... 
    at com.essent.belgium.ediel.services.EdielBeanTest.testSupplierSwitch(EdielBeanTest.java:42) 
    at 
    .... 

ответ

1

Я никогда не работал с Camel, поэтому я не уверен, что это будет работать в вашем случае, но это то, как я wo ÜLD изменить модульные тесты для работы:

BeansConfiguration

@Configuration 
public class BeansConfiguration 
{ 
    @Autowired 
    private Environment environment; 

    @Bean(name = "edielbean") 
    public EdielBean edielBean() 
    { 
     return new EdielBean(); 
    } 
} 

EdielBeanTest

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = BeansConfiguration.class) 
public class EdielBeanTest extends CamelTestSupport { 

    @Autowired 
    private ApplicationContext context; 

    @Override 
    public String isMockEndpoints() { 
     // camel 
     return "*"; 
    } 

    @Test 
    public void testSupplierSwitch() throws Exception 
    { 
     getMockEndpoint("mock:market-out").expectedMessageCount(1); // camel 
     System.out.println("beans: " + context.getBeanDefinitionCount()); 
     for (String name : context.getBeanDefinitionNames()) { 
      System.out.println(name); 
     } 
     EdielBean edielBean = (EdielBean) context.getBean("edielbean"); 
     edielBean.startSupplierSwitch(createCustomer(), createOrder(), "54", "43"); 

     assertMockEndpointsSatisfied(); // camel 
    } 

    private Customer createCustomer() 
    { 
     Customer customer = new Customer(); 
     // .... part omitted 
     return customer; 
    } 

    private Order createOrder() { 
     Order order = new Order(); 
     // .... part omitted 
     return order; 
    } 
} 

Я удалил реализацию ApplicationContextAware, Autowired ApplicationContext, и изменил @ContextConfiguration, чтобы указать на BeansConfiguration класс. Последнее может быть неверным, если класс BeansConfiguration загружен другим классом JavaConfig. В этом случае вы должны указать ContextConfiguration в родительскую конфигурацию.

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

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