Autowiring de haricots générés par la méthode d'usine EasyMock?
J'ai un problème qui me semble vraiment étrange pour moi. J'ai la configuration suivante:
Une interface:
package com.example;
public interface SomeDependency {
}
Un printemps composant:
package com.example;
@Component
public class SomeClass {
}
Un ressort test de config avec un moqué de haricot généré par EasyMock:
<beans ....>
<context:component-scan base-package="com.example"/>
<bean id="someInterfaceMock" class="org.easymock.EasyMock" factory-method="createMock">
<constructor-arg value="com.example.SomeDependency" />
</bean>
</beans>
Et d'une unité de test:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testconfig.xml")
public class SomeClassTest {
@Autowired
SomeClass someClass;
@Autowired
SomeDependency someDependency;
@Test
public void testSomeClass() throws Exception {
assertNotNull(someClass);
}
@Test
public void testSomeDependency() throws Exception {
assertNotNull(someDependency);
}
}
Le projet compile et les tests passent sans aucun problème, à savoir permettra à l'autowiring de deux SomeClass (un "vrai" de l'objet) et SomeDependency (un objet fantaisie généré par EasyMock) réussir.
Cependant, si je change la mise en œuvre de SomeClass:
@Component
public class SomeClass {
@Autowired
SomeDependency someDependency;
}
les deux tests échouent car
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.example.SomeDependency] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Donc mes questions sont:
- Pourquoi le Printemps ne parviennent pas à autowire la dépendance à SomeClass (lorsqu'il réussit permettra à l'autowiring la même dépendance à SomeClassTest)?
- Comment puis-je changer la SomeClassTest ou testconfig.xml pour faire les tests pass?
Commentaire: En réalité, la classe représentée par SomeClass fait partie d'un cadre. Par conséquent, il ne peut être facilement mis à jour, au moins pas dans un délai raisonnable.
Dépendances:
- Printemps: 3.0.5.COMMUNIQUÉ de
- EasyMock: 3.0
Edit:
Dès le Printemps 3.2 RC1, le problème avec les génériques d'usine, les méthodes et les objets fantaisie a été résolu.
/Mattias
source d'informationauteur matsev
Vous devez vous connecter pour publier un commentaire.
Il semble que l'ordre des définitions dans le fichier xml du fait de l'importance lors de l'utilisation des usines à créer des haricots avec permettra à l'autowiring. Si vous placez la déclaration de
someInterfaceMock
ci-dessuscomponent-scan
il va travailler.Quelques éclaircissements pourquoi: Quand le Printemps essaie de autowire
SomeClass
elle recherche un bean de typeSomeDependency
. À ce stadesomeInterfaceMock
est encore une usine afin de Printemps vérifie la signature de la méthode de factorisationEasyMock.createMock(...)
qui renvoie<T>
si le Printemps ne trouve unObject
qui n'est pas le type requis.Une meilleure façon serait d'utiliser le Printemps
FactoryBean
interface pour créer votre simulacres.Ici est une base de mise en œuvre qui devrait fonctionner:
Ici, c'est le haricot définition (l'ordre n'a pas d'importance!):