如何在单元测试期间使用AnnotationConfigWebApplicationContext(Spring框架)加载配置类

我使用
Spring framework 3.0.5来构建Web应用程序.我使用@Configuration批注来配置我的域对象,并且一些域对象具有会话范围.当我使用jUnit 4.8.2编写单元测试时,AnnotationConfigWebApplicationContext变量无法获取配置类中定义的bean.

我总是得到以下例外:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'country' is defined

有没有人可以就这个问题给我一些建议?非常感谢!

这是我的配置类,单元测试类,DAO类和域对象类. (我使用注释配置应用程序而不是xml)

配置类:

@Configuration
public class RegionDomainObj
{

 /**
  *  Define City Domain Object bean
  */
 @Bean
 @Scope("session")
 public CityImp city()
 {
  return new CityImp();
 }

 /**
  *  Define City IP Domain Object bean
  */
 @Bean
 @Scope("session")
 public CityIPImp cityIP()
 {
  return new CityIPImp();
 }

 /**
  *  Define Country Domain Object bean
  */
 @Bean
 @Scope("session")
 public CountryImp country()
 {
  return new CountryImp();
 }

 /**
  *  Define Country IP Domain Object bean
  */
 @Bean
 @Scope("session")
 public CountryIPImp countryIP()
 {
  return new CountryIPImp();
 }

 /**
  *  Define Locale Domain Object bean
  */
 @Bean
 @Scope("session")
 public LocaleImp locale()
 {
  return new LocaleImp();
 }

 /**
  *  Define Region Domain Object bean
  */
 @Bean
 @Scope("session")
 public RegionImp region()
 {
  return new RegionImp();
 }

 /**
  *  Define Top Level Domain Domain Object bean
  */
 @Bean
 @Scope("session")
 public TopLevelDomainImp topLevelDomain()
 {
  return new TopLevelDomainImp();
 }
}

测试超级:

@RunWith(SpringJUnit4ClassRunner.class)
public class TestENV 
{
 protected AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext;

 @Before
 public void setUp()
 {
  annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext();
  annotationConfigWebApplicationContext.refresh();
 }
}

单元测试类:

public class CountryDAOTest extends TestENV
{

 private ICountryDAO countryDAO; 

 private ICountry country;

 @Before
 public void setUpLocalTestENV()
 {
  this.country = (ICountry) this.annotationConfigWebApplicationContext.getBean("country");
  this.countryDAO = (ICountryDAO) this.annotationConfigWebApplicationContext.getBean("crazyamsCountryDAO");
 }

 /* Test save country */
 @Test
 public void testSaveCountry()
 {
   this.country.setCode("AU");
   this.country.setName("Australia");
   this.countryDAO.save(this.country);
         /* ignore the assert functions */
 }
}

更新

也许我使这个问题过于复杂,你知道,当我们使用AnnotationConfigApplicationContext时,我们可以使用以下代码来注册bean定义.

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();

annotationConfigApplicationContext.register(TestProcessUnitConfig.class, OtherClazz.class);

在我的项目中,我使用带有注释支持的Spring MVC,并使用AnnotationConfigWebApplicationContext而不是AnnotationConfigApplicationContext.

虽然它们非常相似,但AnnotationConfigWebApplicationContext不提供“注册”功能.

我只是想知道是否有另一种方法将bean定义注册到AnnotationConfigWebApplicationContext中.

最佳答案 我想你需要在上下文构造函数中使用你的@Configuration类:

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RegionDomainObj.class);

或者注册:

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(RegionDomainObj.class);

据我所知,AnnotationConfigWebApplicationContext(带有’Web’)用于JSF的东西.

点赞