web-dev-qa-db-fra.com

PowerMock + Mockito VS Mockito seul

Quelqu'un peut-il résumer, quelles sont exactement les fonctionnalités qui vous donnent l'ajout de PowerMock sur le Mockito?

Jusqu'à présent, je les ai trouvés:

  • simuler les méthodes statiques, finales et privées
  • supprimer les initialiseurs statiques
  • permettre de se moquer sans injection de dépendance - celui-ci n'est pas clair pour moi. Peux-tu élaborer?

Ajoute-t-il autre chose? Pouvez-vous résumer en plusieurs lignes?

Et dois-je sacrifier quelque chose lors de l'utilisation de PowerMock?

50

Je ne connais pas d'autres avantages au départ, mais je veux répondre à 2 de vos sous-questions (et c'est beaucoup trop long pour un commentaire):

permettre de se moquer sans injection de dépendance - celui-ci n'est pas clair pour moi. Peux-tu élaborer?

Je pense que cela vient de la page wiki de motivation où ils décrivent un moyen de refactoriser le code pour ne pas invoquer des méthodes statiques pour le rendre testable. Pour un exemple concret de ce à quoi je pense, disons que vous avez ce code et que vous souhaitez tester la méthode en se moquant du comportement de la méthode statique, sans utiliser powermock:

public class MyClass {
     public void doGetString() {
         ...
         OtherClass.getString(); //It's complex and scary and needs mocking!
         ...
     }
}

Une solution serait de tirer l'invocation statique dans son propre objet, puis d'injecter un objet dont on peut se moquer lors du test. Par exemple, sans utiliser d'autres frameworks, cela pourrait ressembler à:

public class MyClass {
     public static class StringGetter {
         public getString() {
             return OtherClass.getString();                 
         }
     }

     private final StringGetter getter;

     //Existing Constructor
     public MyClass() {
         this(new StringGetter());
     }

     //DI Constructor
     MyClass(StringGetter getter) {
         this.getter = getter;
     }

     public void doGetString() {
         ...
         getter.getString();
         ...
     }
}

J'ai séparé le comportement de ma méthode du comportement de l'invocation statique, et je peux utiliser le constructeur DI pour injecter facilement des maquettes au moment du test. Bien sûr, avec powermock, je pouvais simplement me moquer de la méthode statique en place et l'exécuter.

Et dois-je sacrifier quelque chose lors de l'utilisation de PowerMock?

Physiquement non, mais je dirais philosophiquement oui :). Voici mes opinions, et j'essaie de donner de bonnes raisons derrière elles, mais bien sûr, ce sont des opinions, alors prenez-les avec un grain de sel:

La chose potentiellement effrayante qui se produit avec PowerMock est que pour accomplir les prouesses de se moquer des méthodes privées et statiques, ils utilisent un chargeur de classe personnalisé (qui ne devrait pas être présent lors de l'exécution en production) et changent le bytecode de vos classes . On peut dire que cela ne devrait pas avoir d'importance avec la grande majorité des classes la plupart du temps, mais si vous y pensez, si le bytecode a changé et que certains effets secondaires ne sont plus présents, vous testez effectivement différentes classes albiet en fonction de votre Classes existantes. Oui, c'est un argument très académique.

Vous pouvez atténuer quelque peu ce premier argument en ayant une bonne intégration complète et des tests de niveau supérieur qui n'utilisent pas PowerMock. De cette façon, vous pouvez être plus confiant dans les comportements de vos objets même si vos tests unitaires utilisent PowerMock.

L'autre argument que j'ai contre PowerMock, c'est qu'il pourrait presque trop facilement devenir une béquille. Je suis d'accord que PowerMock peut vous aider à tester le code qui utilise le code hérité et tout autre code sur lequel vous n'avez aucun contrôle. Cependant, je dirais que lorsque vous avez le contrôle sur les classes dont vous avez besoin de vous moquer, vous devez éviter son utilisation. Si vous écrivez une classe avec une méthode privée ou une méthode statique que vous devez explicitement simuler afin de tester d'autres méthodes, mon instinct dirait que cette méthode peut faire trop et doit être refactorisée et brisée. Ayant PowerMock déjà disponible dans un projet, vous pourriez être tenté de vous moquer de lui et de passer à autre chose, ce qui atténuerait la douleur qui devrait vous encourager à refactoriser la même chose. Oui, cela est parfois dû à diverses contraintes techniques et non techniques, ce n'est pas possible, mais il est bon de résoudre les points douloureux au lieu de les éviter :)

49
Charlie

PowerMock est une extension de Mockito qui permet de se moquer des méthodes statiques, des constructeurs, des classes et méthodes finales, des méthodes privées, de la suppression des initialiseurs statiques et plus encore.

7
Premraj

Une autre caractéristique de l'extension Powermock mockito est qu'elle prend en charge la moquerie et le stubbing d'égaux et de hashcode .

Comme avec toutes les fonctionnalités de Powermock à utiliser avec précaution, mais l'ajout d'une égalité (basée sur la valeur) pour des résultats spécifiques peut être utile.

6
avandeursen

Une autre caractéristique de PowerMock est que nous pouvons construction factice de nouveaux objets dans une méthode. Il est utile lorsque nous ne pouvons pas changer le code de la méthode à tester.

4
Caesar

Pour se moquer de la classe finale, nous pouvons utiliser org.mockito.plugins.MockMaker. Ce que vous devez faire, c'est

  1. Créez un dossier dans votre test/resource dossier avec nommockito-extensions.
  2. Créez un fichier sous celui-ci avec le nom org.mockito.plugins.MockMaker.
  3. Dans ce fichier, une seule ligne mock-maker-inline

Cela ne vous obligera pas à ajouter une nouvelle bibliothèque et donc à économiser du temps d'exécution.

0
Anuj Acharya