java - Autowiring 在 Junit 测试和 spring @configuration 中失败

标签 java spring junit autowired

我有两个@Configuration类。我需要一个从一个配置类到另一个配置类的 bean。我已将配置 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();   
        ...
    }
}

最佳答案

通过调用new,您自己创建对象,Spring对此一无所知。

此外,您应该有一个能够识别您的 bean 的测试配置。

使用适当的Runner来加载SpringContext

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

    @Autowired // if needed
    private MessagingServicesConfig config;
}

TestConfig中,您可以创建bean或从应用程序导入配置:

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

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

或者您可以直接引用您的配置类:

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

关于java - Autowiring 在 Junit 测试和 spring @configuration 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54327368/

相关文章:

java - 从两台(或更多)不同机器访问单个文件时遇到问题吗?

java - CAS 4.2 获取LDAP属性

java - 动态数组 pop 方法可以工作,但 JUnit 中出现错误

unit-testing - 测试 Storm bolt 和喷口

java - 我可以直接从java代码调用spring集成链元素吗?

java - 如何在节点Firebase中获得唯一的随机产品?

java - 如何根据 JSON 对象的字段值创建特定 Java 类的对象?

java - 在 Java 中转换为时间戳

spring - 使用两个用于移动和 Web 的 Azure AD 应用注册

java - junit 重新加载类