Quel est le meilleur framework simulé pour Java? [fermé]


347

Quel est le meilleur cadre pour créer des objets fictifs en Java? Pourquoi? Quels sont les avantages et les inconvénients de chaque cadre?

Réponses:


315

J'ai eu beaucoup de succès avec Mockito .

Quand j'ai essayé d'apprendre à propos de JMock et EasyMock, j'ai trouvé que la courbe d'apprentissage était un peu raide (bien que ce soit peut-être juste moi).

J'aime Mockito en raison de sa syntaxe simple et propre que j'ai pu saisir assez rapidement. La syntaxe minimale est conçue pour prendre en charge très bien les cas courants, bien que les quelques fois où j'ai dû faire quelque chose de plus compliqué, j'ai trouvé que ce que je voulais était pris en charge et facile à saisir.

Voici un exemple (abrégé) de la page d'accueil de Mockito:

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

Cela ne devient pas beaucoup plus simple que cela.

Le seul inconvénient majeur auquel je peux penser est qu'il ne se moquera pas des méthodes statiques.


15
Beau. Pour les méthodes statiques, combinez simplement Mockito avec JMockit et il n'y a pratiquement pas de classe trop "héritée" pour que vous puissiez tester.
Epaga

6
J'adore la façon dont lorsque vous essayez de faire quelque chose que vous ne devriez pas faire (par exemple, créer des simulations en ligne), vous obtenez une explication très claire de ce que vous avez fait de mal dans le message d'exception.
ripper234

3
Pour moi, absolument. Je le recommanderais toujours sans condition. Bien sûr, si vous trouvez un autre cadre qui répond mieux à vos besoins, mentionnez-le dans une autre réponse et voyez quels votes il obtient et quels types de commentaires il reçoit.
Brian Laframboise

2
@MexicanHacker pourquoi ne pourriez-vous pas l'utiliser pour Android? Je l'utilise en ce moment, avec Robolectric.
Ilkka

2
J'utilise Mockito et j'adore !! Excellente documentation aussi (si rare de trouver une documentation de cette qualité, bon travail des auteurs), ce qui est si important pour nous d'utiliser des trucs sans avoir à fouiller dans le code du framework !!!
Renato

84

Je suis le créateur de PowerMock donc évidemment je dois le recommander! :-)

PowerMock étend à la fois EasyMock et Mockito avec la possibilité de se moquer des méthodes statiques, des méthodes finales et même privées. Le support EasyMock est complet, mais le plugin Mockito a besoin de plus de travail. Nous prévoyons également d'ajouter le support JMock.

PowerMock n'est pas destiné à remplacer d'autres frameworks, il peut plutôt être utilisé dans les situations délicates lorsque d'autres frameworks ne permettent pas de se moquer. PowerMock contient également d'autres fonctionnalités utiles telles que la suppression des initialiseurs et constructeurs statiques .


Powermock est essentiel pour tester les applications Android en utilisant Java natif sur le PC hôte (en évitant d'utiliser l'émulateur lent)
Jeff Axelrod

@Jan seul problème est que PowerMock est incompatible lorsque vous utilisez Robolectric :-( Je veux faire @RunWith (PowerMockRunner.class) AND @RunWith (RobolectricTestRunner.class)
Blundell

Après avoir utilisé PowerMock au cours des derniers mois, je le recommande vivement!
cwash

PowerMock est vraiment génial. J'adore vraiment les singletons statiques pour accéder à tout, et cela permet de tester.
Ian Macalinao

Attention: certaines choses comme les méthodes finales moqueuses ne sont possibles que dans Powermock pour EasyMock et pas pour Mockito. C'est un peu un problème lorsque vous ne l'utilisez pas si souvent. Je me demandais pourquoi quelque chose ne fonctionnait pas, alors j'ai réalisé qu'il n'était répertorié que dans la section Easymock du doco.
trafalmadorian

46

Le site du projet JMockit contient de nombreuses informations comparatives pour les kits d'outils de moquerie actuels.

En particulier, consultez la matrice de comparaison des fonctionnalités , qui couvre EasyMock, jMock, Mockito, Unitils Mock, PowerMock et bien sûr JMockit. J'essaie autant que possible de le garder exact et à jour.


1
Je suis impressionné par JMockit, il a une courbe d'apprentissage plus abrupte, mais il a une très bonne documentation pendant des années, et il peut se moquer de tout. J'ai commencé avec Mockito, qui était facile à apprendre, mais je rencontrais régulièrement des problèmes que je ne pouvais pas résoudre avec. D'un autre côté, je ne peux même pas imaginer ce qui est impossible avec JMockit.
Hontvári Levente

21

J'ai eu du succès avec JMockit .

C'est assez nouveau, et c'est donc un peu brut et sous-documenté. Il utilise ASM pour redéfinir dynamiquement le bytecode de classe, de sorte qu'il peut simuler toutes les méthodes, y compris les constructeurs statiques, privés, et les initialiseurs statiques. Par exemple:

import mockit.Mockit;

...
Mockit.redefineMethods(MyClassWithStaticInit.class,
                       MyReplacementClass.class);
...
class MyReplacementClass {
  public void $init() {...} // replace default constructor
  public static void $clinit{...} // replace static initializer
  public static void myStatic{...} // replace static method
  // etc...
}

Il dispose d'une interface Attentes permettant également des scénarios d'enregistrement / lecture:

import mockit.Expectations;
import org.testng.annotations.Test;

public class ExpecationsTest {
  private MyClass obj;

  @Test
  public void testFoo() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo("foo", false), "bas");
      }
    };

    assert "bas".equals(obj.getFoo("foo", false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(String str, boolean bool) {
      if (bool) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}

L'inconvénient est qu'il nécessite Java 5/6.


oui, je peux vraiment le recommander
Epaga

7
Juste une mise à jour: le projet JMockit est passé à code.google.com/p/jmockit . Il a beaucoup évolué depuis ce post (et évolue toujours), et dispose désormais d'une documentation complète.
Rogério

JMockit a déménagé à nouveau. Il est maintenant disponible sur Github. jmockit.github.io
Ravi Thapliyal

15

Vous pouvez également consulter les tests à l'aide de Groovy. Dans Groovy, vous pouvez facilement vous moquer des interfaces Java en utilisant l'opérateur 'as':

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

En dehors de cette fonctionnalité de base, Groovy offre beaucoup plus sur le front moqueur, y compris les puissants MockForet les StubForclasses.

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks


13

J'ai commencé à utiliser des simulacres avec EasyMock . Assez facile à comprendre, mais l'étape de relecture était un peu ennuyeuse. Mockito supprime cela, a également une syntaxe plus propre car il semble que la lisibilité était l'un de ses principaux objectifs. Je ne saurais trop insister sur l'importance de cela, car la plupart des développeurs passeront leur temps à lire et à maintenir le code existant, pas à le créer.

Une autre bonne chose est que les interfaces et les classes d'implémentation sont gérées de la même manière, contrairement à EasyMock où vous devez toujours vous souvenir (et vérifier) ​​d'utiliser une extension de classe EasyMock.

J'ai jeté un rapide coup d'œil à JMockit récemment, et bien que la liste des fonctionnalités de blanchisserie soit assez complète, je pense que le prix de cela est la lisibilité du code résultant, et devoir écrire plus.

Pour moi, Mockito frappe le bon pied, étant facile à écrire et à lire, et traitant la majorité des situations que la plupart des codes nécessiteront. Utiliser Mockito avec PowerMock serait mon choix.

Une chose à considérer est que l'outil que vous choisiriez si vous développiez vous-même ou dans une petite équipe soudée, pourrait ne pas être le meilleur à obtenir pour une grande entreprise avec des développeurs de niveaux de compétences différents. La lisibilité, la facilité d'utilisation et la simplicité nécessiteraient plus d'attention dans ce dernier cas. Cela n'a aucun sens d'obtenir le cadre de simulation ultime si beaucoup de gens finissent par ne pas l'utiliser ou ne pas maintenir les tests.


1
+1 Cette réponse a besoin de plus de votes positifs. On devrait partager ce qu'ils ont réellement aimé ou non au sujet du cadre. Juste "J'ai utilisé ça .. et j'ai bien aimé!" est l'une des raisons pour lesquelles ces bonnes questions sont fermées sur SO.
Ravi Thapliyal

11

Nous utilisons beaucoup EasyMock et EasyMock Class Extension au travail et nous en sommes très satisfaits. Il vous donne essentiellement tout ce dont vous avez besoin. Jetez un œil à la documentation, il y a un très bel exemple qui vous montre toutes les fonctionnalités d'EasyMock.


1
Dans ma question, je cherchais plus ce que vous aimez et n'aimez pas dans un cadre simulé. Je peux trouver la documentation et tout lire - je veux savoir ce qu'en pensent les personnes qui l'ont utilisé.
Josh Brown

EasyMock ne fonctionne que sur Java 5 et supérieur, argh!
mat

8

J'ai utilisé JMock tôt. J'ai essayé Mockito lors de mon dernier projet et j'ai bien aimé. Plus concis, plus propre. PowerMock couvre tous les besoins qui sont absents dans Mockito, comme se moquer d'un code statique, se moquer d'une création d'instance, se moquer des classes et méthodes finales. J'ai donc tout ce dont j'ai besoin pour effectuer mon travail.


6

J'aime JMock parce que vous êtes capable de définir des attentes. C'est totalement différent de vérifier si une méthode a été appelée trouvée dans certaines bibliothèques fictives. En utilisant JMock, vous pouvez écrire des attentes très sophistiquées. Voir le cheat-sheat jmock .



4

La meilleure solution pour se moquer est de faire effectuer tout le travail à la machine avec des tests automatisés basés sur les spécifications. Pour Java, voir ScalaCheck et le cadre Reductio inclus dans la bibliothèque Java fonctionnelle . Avec les frameworks de test basés sur des spécifications automatisées, vous fournissez une spécification de la méthode testée (une propriété qui devrait être vraie) et le framework génère automatiquement des tests ainsi que des objets fantaisie.

Par exemple, la propriété suivante teste la méthode Math.sqrt pour voir si la racine carrée d'un nombre positif n au carré est égale à n.

val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }

Lorsque vous appelez propSqrt.check(), ScalaCheck génère des centaines d'entiers et vérifie votre propriété pour chacun, s'assurant également automatiquement que les cas de bord sont bien couverts.

Même si ScalaCheck est écrit en Scala et nécessite le compilateur Scala, il est facile de tester le code Java avec. Le framework Reductio en Java fonctionnel est une implémentation Java pure des mêmes concepts.


3

Mockito fournit également l'option de méthodes de stubbing, de correspondances d'arguments (comme anyInt () et anyString ()), de vérification du nombre d'appels (times (3), atLeastOnce (), never ()), et plus encore .

J'ai également trouvé que Mockito est simple et propre .

Une chose que je n'aime pas chez Mockito, c'est que vous ne pouvez pas bloquer les méthodes statiques .


Cette réponse est inexacte. Vous n'êtes pas limité aux interfaces avec jMock. Vous pouvez simuler des classes concrètes avec ClassImposteriser.
Teflon Ted

Vous pouvez également faire exactement les mêmes choses avec EasyMock.
Cem Catikkas

J'ai supprimé les inexactitudes de ma réponse.
Josh Brown

2

Pour quelque chose d'un peu différent, vous pouvez utiliser JRuby et Mocha qui sont combinés dans JtestR pour écrire des tests pour votre code Java en Ruby expressif et succinct. Il y a quelques exemples de moquerie utiles avec JtestR ici . Un avantage de cette approche est que se moquer des classes concrètes est très simple.


1

J'ai commencé à utiliser des simulations via JMock, mais j'ai fini par passer à EasyMock. EasyMock n'était que cela, - plus facile - et offrait une syntaxe plus naturelle. Je n'ai pas changé depuis.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.