Injecter des Simulacres d'objets créés par l'Usine de classes
J'ai la classe suivante:
public class MyClass {
private Apple apple;
public void myMethod() {
apple = AppleFactory.createInstance(someStringVariable);
....
....
....
}
}
Et la classe de Test:
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@InjectMocks
MyClass myClass;
@Test
public void myMethod(){
...
...
...
}
}
Comment ai-je pu injecter une Pomme instance comme une fantaisie dans Maclasse?
OriginalL'auteur saravana_pc | 2014-02-19
Vous devez vous connecter pour publier un commentaire.
Vous avez 3 possibilités pour résoudre ce problème:
Résumé de l'usine: au Lieu d'utiliser une méthode statique, l'utilisation d'une usine de béton de classe:
Dans votre classe de test, se moquent de l'usine:
PowerMock: Utilisation PowerMock pour créer une maquette d'une méthode statique. Regardez ma réponse à une question pertinente pour voir comment c'est fait.
Testable classe: Faire de la
Apple
création enveloppé dans unprotected
méthode et créer une classe de test qui la remplace:Bien sûr, dans votre classe de test, vous devez tester la
TestableMyClass
et pasMyClass
.Je vais vous dire mon opinion sur chacune des méthodes:
Le résumé de l'usine méthode est le meilleur - C'est une conception claire qui cache les détails de mise en œuvre
Les tests de la classe Est la deuxième option qui n'exige qu'un minimum de modifications
PowerMock
option est ma préférée au moins - au Lieu de passer pour un meilleur design, vous ignorer et cacher votre problème. Mais c'est toujours une option valable.J'ai ajouté mon classement pour les questions. Néanmoins, vous pouvez utiliser
mockito
avec le pouvoir en dérision. Au lieu d'utiliser le@Mock
et@InjectMock
vous pouvez utiliser leurs méthodes équivalentes (et donc vous pouvez vous débarrasser de l'@RunWith(MockitoJUnitRunner.class)
déclaration)lors de la mise en œuvre de l'abstrait modèle de fabrique, wont une interface plus appropriées?
OriginalL'auteur Avi
Concernant la première réponse de Avi & Ev0oD. Les classes abstraites ne peuvent être étendus et pas mis en œuvre.
OriginalL'auteur ugurkocak1980
En plus de la solution proposée par Avi, vous pouvez choisir un quatrième possibilité:
Injecter dans l'Usine:
C'est, pour moi, la meilleure option si vous avez déjà le code pour refacrot. Avec cette solution, vous n'avez pas à changer porduction code, mais seulement de l'usine de la classe et de test.
Vous pouvez maintenant utiliser votre statique usine simplement:
OriginalL'auteur Glauco Cucchiar