我的测试类注释如下:
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional(propagation= Propagation.REQUIRED)
@ContextConfiguration(classes = { TestLocalPersisterConfiguration.class })
@ActiveProfiles(EnvironmentProfile.TEST_LOCAL)
public class MyTestClass {
// run someMethod here that loads AnnotationConfigApplicationContext in Java class
}
从测试类中,我从主类运行一个方法,并尝试加载AnnotationConfigApplicationContext`:
// Java class method that is run from test class
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestLocalPersisterConfiguration.class, ProdPersisterConfiguration.class);
GCThreadStopRepository repository = applicationContext.getBean(GCThreadStopRepository.class);
然而,Spring正在抱怨No qualifying bean of type [ca.nbc.data.sql.repository.GCThreadStopRepository] is defined
我不确定为什么会这样,也不知道如何解决这个问题。
GCThreadStopRepository
注明了@Repository
。
TestLocalPersisterConfiguration
扩展GenericPersisterConfiguration
,它具有以下内容来扫描和加载bean定义:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
String persistenceUnitName = environment.getProperty(PROPERTY_PERSISTENCE_UNIT);
final LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean();
emfBean.setPersistenceUnitName(persistenceUnitName);
emfBean.setPackagesToScan("ca.nbc.data.sql");
emfBean.setPersistenceXmlLocation("classpath:META-INF/persistence.xml");
emfBean.setDataSource(dataSource());
if(getJpaProperties() != null) {
emfBean.setJpaProperties(getJpaProperties());
}
return emfBean;
}
更新
我发现当在Java类中启动AnnotationConfigApplicationContext
时,测试类中的@ActiveProfiles(EnvironmentProfile.TEST_LOCAL)
设置不会传播到Java类,即。在Java类中运行applicationContext.getEnvironment().getActiveProfiles()
会返回一个空数组。
有没有办法将@ActiveProfiles(EnvironmentProfile.TEST_LOCAL)
传播到系统范围?
答案 0 :(得分:0)
您不应该自己初始化应用程序上下文,一旦使用@ContextConfiguration
,您实际上已经拥有它您需要做的就是:
@Autowired
GCThreadStopRepository repository;
您只需要确保在您扫描的@Configuration类中定义bean - 通过在以下位置定义它:
@ContextConfiguration(classes = {YourClass.class})
或@Configuration类本身 - @ComponentScan for @Component或@Import添加另一个@Configuration类
要使用ActiveProfiles,您需要在类上定义@Profile。如果某个类没有定义@Profile - 它将在所有配置文件中处于活动状态。根据配置文件,只有定义@Profile的类才会被包含/排除在扫描中。 所以这不是问题。 你需要添加
@ComponentScan("ca.nbc.data.sql.repository")
TestLocalPersisterConfiguration中的- 将扫描包并读取@Repository