Les tests unitaires d'une classe avec autocâblés notation à l'aide de Junit et EasyMock?
Je suis en train d'écrire un test Unitaire pour une classe qui dispose de plusieurs de ses champs marqués @Autocâblés. Compte tenu du fait que le Printemps est automatiquement la résolution de la des implémentations concrètes de ces champs, je vais avoir du mal à trouver comment brancher ma Mock objects(créé via EasyMock) que la dépendance au cours de l'exécution des tests. À l'aide de @Autocâblés dans la classe, le manque de techniciens dans cette classe. Est-il un moyen pour moi de brancher ma maquette objets sans créer de nouveaux organismes de normalisation de la classe?
Voici un exemple de ce que je suis en train de réaliser:
public class SomeClassUnderTest implements SomeOtherClass{
@Autowired
private SomeType someType;
@Autowired
private SomeOtherType someOtherType;
@Override
public SomeReturnType someMethodIWouldLikeToTest(){
//Uses someType and someOtherType and returns SomeReturnType
}
}
Voici comment je suis l'artisanat de ma classe de Test avant j'ai frappé le mur:
public class MyTestClassForSomeClassUnderTest{
private SomeType someType;
private SomeOtherType someOtherType;
@Before
public void testSetUp(){
SomeClassUnderTest someClassToTest = new SomeClassUnderTest();
someType = EasyMock.createMock(SomeType.class);
someOtherType = EasyMock.createMock(SomeOtherType.class);
//How to set dependencies????
}
@Test
public void TestSomeMethodIWouldLikeToTest(){
//??????
}
}
Il sera grand pour obtenir un coup de pouce dans la bonne direction.
Grâce
Vous devez vous connecter pour publier un commentaire.
Vous pouvez reflectively injecter des dépendances directement dans le champ à l'aide de
ReflectionTestUtils
, par exempleCertains diront qu'il est préférable d'ajouter un paquet visible méthode de définition de la classe de toute façon, utilisé uniquement par les tests. Vous pouvez également utiliser autocâblés constructeurs, plutôt que de autocâblés champs, et injecter le test de dépendances dans que.
Bien qu'il est possible de définir ces champs via la réflexion, cela empêchera vos outils de développement de trouver des usages de ces champs, et rendre plus difficile pour vous de refactoriser
SomeClassToTest
dans l'avenir.Il serait préférable d'y ajouter les ouvreurs de ces champs, et de la place de la
@Autowired
annotations sur ces dernières. Non seulement cela évite la réflexion, mais il précise également l'interface externe de la classe et s'assure que votre unité de test utilise cette interface. Je vois queSomeClassToTest
implémente déjà l'SomeOtherClass
de l'interface, et je suppose que les clients deSomeClassToTest
uniquement utiliser cette interface, donc il y a peu de danger dans la prise de setters surSomeClassToTest
public.Mieux encore, utilisez constructeur d'injection et de mettre les champs en finale. Vous pouvez toujours utiliser
@Autowired
sur les arguments du constructeur.Je ne recommande pas la réponse qui avait été acceptée, c'est à dire l'utilisation de la réflexion sur votre propre (sans se moquant de cadre).
Depuis la version 3.2 de EasyMock vous pouvez utiliser les annotations pour définir les objets fantaisie et de les injecter dans la classe sous test. Une description complète de la façon de le faire peut être trouvé dans la documentation officielle de EasyMock:
http://easymock.org/user-guide.html#mocking-annotations
Voici un exemple à partir du site ci-dessus: