Сбой автопроводки в тестировании Junit и Spring @configuration - PullRequest
0 голосов
/ 23 января 2019

У меня есть два @Configuration класса. Мне нужен бин из одного класса конфигурации в другой. Я автоматически подключил конфигурацию 1 в 2. Все работает нормально. При выполнении модульного тестирования я получаю следующее исключение.

setUpContext(com.trafigura.titan.framework.services.messaging.loader.SpringLoadTest)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.xxx.MessagingServicesConfig': Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xxx.EMSJMSConfig com.xxx.MessagingServicesConfig.emsJmsConfig; 
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type[com.xxx.EMSJMSConfig] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Что-нибудь еще нужно сделать, чтобы это работало?

Ниже приведена настройка для тестирования.

@Configuration
@Import({MessagingServicesConfig.class,...,EMSJMSConfig.class
})
public class MessagingConfig {}

@Profile("EMS-MESSAGING")
@Configuration
public class EMSJMSConfig {
    @Bean
    public javax.jms.ConnectionFactory jmsSubscriberConnectionFactory() throws JMSException {
        SingleConnectionFactory singleConnectionFactory = new SingleConnectionFactory(tibjmsConnectionFactory());
        return singleConnectionFactory;
    }
}

@Configuration
public class MessagingServicesConfig {
    @Autowired
    private EMSJMSConfig emsJmsConfig;
    @Bean(destroyMethod = "shutdown")
    public MessagingService messagingService() throws JMSException {
        ...
        ConnectionFactory cf=emsJmsConfig.jmsSubscriberConnectionFactory(); // Getting NPE at this line.
    }
}

и, наконец, тестовый класс,

public class MessagingServicesConfigTest {
    private MessagingServicesConfig config;
    private EMSJMSConfig emsJmsConfig;
    @BeforeMethod
    public void setUp() throws Exception {
        config = new MessagingServicesConfig();
        ... //what needs to be done here to have the EMSJMSConfig
    }
    @Test
    public void testBuildsCorrectService() throws JMSException {
        MessagingService service = config.messagingService();   
        ...
    }
}

1 Ответ

0 голосов
/ 23 января 2019

Позвонив по номеру new, вы сами создаете объект, Spring ничего об этом не знает.

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

Используйте соответствующий Runner для загрузки SpringContext.

@ContextConfiguration(classes = TestConfig.class)
@RunWith(SpringRunner.class)
class Tests {

    @Autowired // if needed
    private MessagingServicesConfig config;
}

Находясь в TestConfig, вы можете создать beans или импортировать конфигурацию из приложения:

@Configuration
@Import({MessagingServicesConfig.class})
public class TestConfig {}

@Configuration
@Import({EMSJMSConfig.class})
public class MessagingServicesConfig {}

Или вы можете напрямую обратиться к своим классам конфигурации:

@ContextConfiguration(classes = {MessagingServicesConfig.class, EMSJMSConfig.class})
...