2010-11-11 5 views
3

J'utilise Spring framework 3.0.5 pour créer une application Web. J'utilise l'annotation @Configuration pour configurer mon objet de domaine, et certains des objets de domaine ont une portée de session. Et quand j'écris un test unitaire utilisant jUnit 4.8.2, la variable AnnotationConfigWebApplicationContext ne peut pas obtenir les beans qui sont définis dans la classe de configuration.Comment utiliser AnnotationConfigWebApplicationContext (Spring framework) pour charger la classe de configuration pendant le test unitaire

Je reçois toujours les exceptions suivantes:

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

Est-ce qu'il ya quelqu'un qui peut me donner quelques conseils à ce problème? Merci beaucoup!

Voici ma classe de configuration, la classe de test unitaire, la classe DAO et la classe d'objets de domaine. (Je annotation pour configurer l'application au lieu de xml)

classe de configuration:

@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(); 
} 
} 

test super classe:

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

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

Unité Classe d'essai:

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 */ 
} 
} 

Mise à jour

Peut-être que je fais ce problème trop complexe, vous le savez, lorsque nous utilisons AnnotationConfigApplicationContext, nous pouvons utiliser le code suivant pour enregistrer des définitions de haricots.

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(); 

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

Et dans mon projet, j'utiliser Spring MVC avec l'aide d'annotations, et je l'utilise AnnotationConfigWebApplicationContext au lieu de AnnotationConfigApplicationContext.

Bien qu'ils soient très similaires, AnnotationConfigWebApplicationContext ne fournit pas de fonction de "registre".

Et je veux juste savoir s'il existe une autre façon d'enregistrer la définition du bean dans AnnotationConfigWebApplicationContext ou non.

+0

Format votre code en utilisant CTRL + K. Il est maintenant illisible. Et omettez les parties sans importance. – Bozho

Répondre

0

Je ne sais pas si c'est la cause, mais il y a une chose qui me dérange:

Votre exportation country comme une classe de mise en œuvre:

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

Mais référence comme une interface:

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

La façon plus évidente serait d'exporter en tant qu'interface ainsi:

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

Essayez de voir si cela fait une différence. Même si ce n'est pas le cas, cela améliore votre code.

2

Je pense que vous devez utiliser votre classe @Configuration int le constructeur de contexte:

AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RegionDomainObj.class); 

ou registre:

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

Comme je sais, AnnotationConfigWebApplicationContext (avec le 'Web') est pour les choses JSF.

0

org.springframework.beans.factory.NoSuchBeanDefinitionException: Aucun haricot nommé

Cette erreur apparaît quand quelque chose ne va pas avec vos classes de configuration. Dans votre cas, vous devez définir directement où vous définissez les haricots. Alors, ajoutez après @Configuration dans lignes de code de votre classe de test:

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