我使用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
。
答案 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..*/);