2010-11-11 64 views
3

我使用Spring框架3.0.5構建一個web應用程序。我使用@Configuration註釋來配置我的域對象,並且一些域對象具有會話範圍。當我使用jUnit 4.8.2編寫單元測試時,AnnotationConfigWebApplicationContext變量無法獲取在配置類中定義的bean。如何在單元測試中使用AnnotationConfigWebApplicationContext(Spring框架)加載配置類

我總是得到以下情況除外:

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

格式使用CTRL + K。現在是不可讀的代碼。並省略不重要的部分。 – Bozho 2010-11-11 12:01:23

回答

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

我認爲你需要使用你的@Configuration類int的上下文構造:

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RegionDomainObj.class); 

或寄存器:

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

據我所知,AnnotationConfigWebApplicationContext(與 '網絡' )是JSF的東西。

0

org.springframework.beans.factory.NoSuchBeanDefinitionException:無豆命名

此錯誤時出現一些錯誤配置類。在你的情況下,你必須直接定義bean定義的位置。所以,在您的測試類@Configuration之後添加下一個代碼行:

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