J'ai récemment demandé this question concernant l'extraction de beans d'un applicationContext. La réponse était en effet utile, mais il semble maintenant que j'ai un problème avec l'accès à ce bean d'une classe en dehors du test. En d'autres termes, mon test instancie une classe qui utilise un bean issu d'un contexte d'application, mais ce bean continue à être nul.Alors maintenant, pourquoi mon bean est nul?
Mon test met en place le contexte d'application comme ceci:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/applicationContext-test.xml")
public class SearcherTests {
Mon test instancie programme de la classe du référentiel:
Repository searcher = new Repository();
Ma classe Repository a la variable membre suivante:
@Resource
private MyFactory myFactory;
Si je comprends correctement Spring, cela devrait se tourner vers l'application actuelle le contexte d'un bean nommé myFactory
. Selon le test, le contexte de l'application actuelle devrait être applicationContext-test.xml
, qui contient une définition pour myFactory
:
<bean id="myFactory"
name="myFactory"
class="com.foo.Mocks"
factory-method="createMockFactory" />
À l'avenir, cette méthode d'usine retournera une maquette. Mais pour le moment, il retourne juste un objet Factory
régulier:
public class Mocks {
public static MyFactory createMockFactory() {
return new MyFactory();
}
}
Quand je lance l'application de mon navigateur, la variable myFactory
a été correctement instancié de la définition du haricot applicationContext.xml
. Dans mon test, pour m'assurer que mon applicationContext-test.xml
fonctionne, j'ai ce même bean listé comme variable membre comme je le fais dans la classe Repository
. Lors de l'exécution du test, la variable myFactory
dans le fichier contenant le test ressemble exactement à ce à quoi je m'attendais. Toutefois, lorsque j'arrive à la classe Repository
, la variable myFactory
dans cette classe est null. Il semble que cette classe n'instancie pas la variable myFactory
en fonction de la définition du bean dans applicationContext-test.xml
. Quelqu'un peut-il me dire pourquoi?
Mise à jour
j'ai changé la variable searcher
de sorte qu'il est un grain de printemps, plutôt que instancier la classe Repository
manuellement, et maintenant la variable myFactory
a été peuplée dans la classe Repository
. Quelqu'un peut-il expliquer pourquoi cela doit être un haricot pour travailler?
Comment obtient-il 'Repository'? Est-ce un haricot de printemps? – axtavt
Non, le référentiel n'est pas un bean Spring. Mon test instancie réellement une classe, qui à son tour instancie la classe Repository. Toute cette instanciation est faite par programme. – Samo
J'ai changé Repository pour être un haricot de printemps et cela fonctionne maintenant. Je ne sais pas pourquoi il doit être un haricot pour que cela fonctionne. * scratches head * – Samo