从Spring Test

时间:2015-10-14 21:24:43

标签: java spring

我的测试类注释如下:

@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)传播到系统范围?

1 个答案:

答案 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