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

时间:2010-11-11 11:59:06

标签: java spring configuration junit

我使用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

3 个答案:

答案 0 :(得分:2)

我认为您需要在上下文构造函数中使用@Configuration类:

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RegionDomainObj.class);

或注册:

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

据我所知,AnnotationConfigWebApplicationContext(使用' Web')是针对JSF的事情。

答案 1 :(得分:0)

我不知道这是不是原因,但有一件事困扰着我:

您导出country作为实现类:

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

但是将其作为界面引用:

this.country = (ICountry) this.annotationConfigWebApplicationContext.getBean("country");

更明显的方法是将其导出为界面:

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

尝试看看是否有所作为。即使它没有,它也会改进你的代码。

答案 2 :(得分:0)

  

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为

的bean

配置类出现问题时会出现此错误。在您的情况下,您必须直接定义bean定义的位置。因此,在测试类@Configuration之后添加下一个代码行:

@WebAppConfiguration
@ContextConfiguration(classes={/*..your configuration classes*/})
@PropertySource(/*.. your possible properties files..*/);