Annotation @RunWith(PowerMockRunner.class) vs annotation @RunWith(MockitoJUnitRunner.class)
Comme d'habitude en se moquant avec @Mock
et @InjectMocks
annotations, la classe sous test doit être exécuté avec @RunWith(MockitoJUnitRunner.class)
.
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
//Some tests
}
mais dans certains exemple que je viens de voir @RunWith(PowerMockRunner.class)
:
@RunWith(PowerMockRunner.class)
public class Tests {
@Mock
private ISomething mockedSomething;
@Test
public void test1() {
//Is the value of mockedSomething here
}
@Test
public void test2() {
//Is a new value of mockedSomething here
}
}
quelqu'un pourrait-il remarquer quoi la différence et quand je veux utiliser l'un plutôt que l'autre?
OriginalL'auteur Johan | 2016-07-08
Vous devez vous connecter pour publier un commentaire.
Sur un premier coup d'œil, la réponse est tout simplement: eh bien, il ya plusieurs se moquant de cadres.
Mais l'horrible vérité est: la PowerMock-fond est un appel à l'aide. Il dit: "la classe sous test est mauvais, veuillez les corriger".
Au sérieux; PowerMock vous permet de tester le code qui ne peut pas être testé avec d'autres moqueries des cadres: il prend vos cours de production (donc l'octet de code provenant de votre source) et manipule ceux afin de permettre moqueur statique méthodes ou final classes/méthodes. Qui n'a pas l'air trop mal, mais croyez-moi: il est.
Tout d'abord, cela signifie que PowerMock n'a pas fait de test votre classes, mais les classes qui PowerMock manipulé. Alors: (plus ou moins complètement) tue votre capacité à exécuter la couverture de l'outillage.
Et le pire de tous: soyez prêt pour bizarre échoue, que vous ne comprenez pas, que vous pouvez déboguer pendant des heures, à ne jamais trouver quelque chose de mal avec votre code. Surtout quand vous travaillez déjà avec d'autres cadres qui ne byte-code de la manipulation.
Donc, dans son essence même, parfois, un design a été mis en œuvre d'une manière qui le rend impossible à tester. Ensuite, certaines personnes décident d'utiliser PowerMock en vue de surmonter ces problèmes afin de toujours permettre le test.
Mais à mes yeux: vous ne devriez pas tourner à PowerMock, au lieu de cela, vous devriez changement votre conception, et de corriger ces problèmes qui font que vous vous demandez PowerMock.
La seule raison acceptable d'utiliser PowerMock est quand vous voulez pour tester existant (peut-être 3ème partie) code que vous ne souhaitez pas modifier. Mais bien sûr, quel est le point de tests de code de ce type? Lorsque vous ne pouvez pas modifier le code, pourquoi les tests échouent, tout d'un coup?
FacesContext.getCurrentInstance()
méthode statique de sorte que vous pouvez vérifier attend les appels à laaddMessage(...)
méthode. Aussi, d'autres allégations formulées ici sont des faits faux ou très discutable.Dans mon expérience, d'une Puissancese moquant de cadres ne sont pas juste *un cadre d'un ensemble d'équivalent cadres. À mes yeux, ce produit est plus fan de ce genre de médecine, qui ne devrait être consommé dans de très rares cas, et après un beaucoup de "briefing" par votre médecin. Chose est: j'ai passé trop d'heures à essayer de réparer PowerMocking autres problèmes connexes, ou d'écouter des gens qui ont vu ces étranges problèmes que vous rencontrez parfois des. Et le plus important: dans 95% des cas, c'était simplement que les gens sont venus avec un mauvais, impossible à vérifier la conception. Et au lieu de changer cela, ils se sont tournés vers PowerMock.
Je suis d'accord, les développeurs ne devraient pas se tourner vers un se moquant de la bibliothèque afin d'éviter la fixation de la testabilité des problèmes. Ceci est tout aussi vrai que la situation dans laquelle ils éviter les bonnes OO ou de conception d'API afin de contourner les limitations de se moquant de la bibliothèque. Pour moi, la meilleure réponse à ces deux situations, c'est d'éviter de se moquant de tout, et aller pour un intégration de test; c'est ce que je fais moi-même.
Il y a des raisons légitimes de vouloir tester les classes qui ne peuvent pas se conformer à une conception testable, par exemple, si vous avez envie de tester une classe qui utilise lwjgl il faudrait créer une couche mince qui appelle simplement la lwjgl classes de méthodes statiques, ou vous pouvez utiliser powermock pour la classe. On aurait besoin de recréer l'API de votre aide et d'avoir à maintenir cette couche, pour ne pas mentionner que votre ajout des appels sur de très boucles serrées qui nécessitent des performances élevées. Tests de code en ayant un système automatisé (et testé) maquette cadre serait de loin supérieure à pas de test du tout.
OriginalL'auteur GhostCat
PowerMock ne devrait jamais être votre premier choix. Si vous avez juste écrit une classe qui n'est testable avec PowerMock que vous avez fait quelque chose de mal. Une classe doit avoir l'injection de dépendance ou d'un constructeur avec dépendances, de sorte que le test est facilitée et bien sûr: n'essayez pas d'utiliser des méthodes statiques car elles ne sont pas mockable régulièrement des cadres (lire:mockito).
De l'autre côté: si vous avez un projet et vous souhaitez ajouter des tests unitaires parce que le développeur précédent ne l'a pas fait, PowerMock peut être la seule solution sans totalement refactoring tout. Et, dans cette perspective, je préfère PowerMock ci-dessus pas de tests à tous les.
PowerMock est sale parce qu'il modifie le bytecode et la couverture de code avec JaCoCo (SonarQube couverture runner) ne fonctionne pas, mais l'Ide de couverture de code runner fonctionne avec PowerMock.
Lorsque dans une classe, une méthode ne peut pas être testé avec Mockito j'ai divisé le test: une classe de test avec Mockito et une classe de test avec PowerMock. Cela permet de garder votre couverture de code mieux dans SonarQube.
Puis j'ai une classe pour tester la première méthode:
Et une avec PowerMock:
OriginalL'auteur Sven
PowerMock vous permet de maquette statique et privés ainsi que les méthodes d'final classes et plus.
Il peut y avoir certains odeur de code si vous avez besoin de se moquer de ceux des types de composants, mais il peut être utile. À un certain point, vous travaillez peut-être dans l'ancien projet qui a créé statique des classes d'aide qui ont dépendances qui doivent être moqué de. Si vous avez la possibilité de changer l'architecture, puis fixer votre conception! Sinon, l'utilisation de la technologie pour vos tests.
Si vous n'avez pas besoin de maquette statique ou privé des fonctions que vous n'avez pas besoin d'utiliser PowerMock. PowerMock est un wrapper autour d'autres se moquant de cadres.
OriginalL'auteur Phil Ninan