Question

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

Était-ce utile?

La solution

J'ai eu un bon succès à l'aide de Mockito.

Quand j'ai essayé d'apprentissage sur JMock et EasyMock, j'ai trouvé la courbe d'apprentissage un peu raide (mais peut-être que c'est juste moi).

J'aime Mockito en raison de son simple et propre syntaxe que j'ai pu saisir rapidement, très rapidement.La syntaxe minimale est conçu pour les cas très bien, mais le peu de fois où j'avais besoin de faire quelque chose de plus compliqué, j'ai trouvé ce que je voulais, c'était pris en charge et facile à saisir.

Voici une (version abrégée) exemple de la Mockito page d'accueil:

import static org.mockito.Mockito.*;

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

Il ne va pas beaucoup plus simple que cela.

Le seul inconvénient majeur est, je pense, de ne pas se moquer des méthodes statiques.

Autres conseils

Je suis le créateur de PowerMock alors, évidemment, je recommande que!:-)

PowerMock s'étend à la fois EasyMock et Mockito avec la capacité de se moquer des méthodes statiques, final et même des méthodes privées.Le EasyMock support est complet, mais le Mockito plugin doit travailler un peu plus.Nous prévoyons d'ajouter des JMock soutien.

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

L' JMockit site du projet contient de nombreuses informations comparatives pour le courant se moquant de boîtes à outils.

En particulier, découvrez la comparaison des fonctionnalités de la matrice, qui couvre EasyMock, jMock, Mockito, Unitils Maquette, PowerMock, et bien sûr JMockit.J'ai essayer de le garder, exacte et à jour, autant que possible.

J'ai eu du succès avec JMockit.

C'est assez nouveau, et donc c'est un peu brut et sous-documentées.Il utilise ASM dynamiquement redéfinir le bytecode de la classe, de sorte qu'il peut se moquer de toutes les méthodes, y compris statique, privé, des constructeurs et des 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 a des Attentes de l'interface permettant d'enregistrement/de lecture des scénarios ainsi:

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.

Vous pourriez aussi avoir un coup d'oeil à l'essai en utilisant Groovy.En Groovy, vous pouvez facilement se moquer d'interfaces Java à l'aide de l'opérateur:

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

En dehors de cette fonctionnalité de base Groovy offre beaucoup plus sur les moqueries à l'avant, y compris le puissant MockFor et StubFor des classes.

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

J'ai commencé à utiliser se moque avec EasyMock.Assez facile à comprendre, mais le replay de l'étape était un peu ennuyeux. Mockito supprime ce, a aussi un nettoyeur de syntaxe comme il ressemble à la lisibilité a été l'un de ses principaux objectifs.Je ne peux pas souligner assez combien il est important, puisque la plupart des développeurs passent leur temps à lire et à maintenir le code existant, de ne pas le créer.

Une autre bonne chose est que les interfaces et les classes d'implémentation sont traitées de la même manière, contrairement à d'EasyMock où encore besoin de vous rappeler (et vérifier) pour utiliser un EasyMock Extension de Classe.

J'ai pris un coup d'oeil rapide à JMockit récemment, et bien que cette liste de fonctionnalités est assez complet, je pense que le prix de ce qui est de la lisibilité du code, et d'avoir à en écrire plus.

Pour moi, Mockito frappe le sweet spot, facile à lire et à écrire, et de traiter avec la majorité des situations, la plupart du code exigera.À l'aide de Mockito avec PowerMock serait mon choix.

Une chose à considérer est que l'outil que vous choisissez si vous développez vous-même, ou dans une petite équipe soudée, peut-être pas le mieux à faire pour une grande entreprise avec des développeurs de différents niveaux de compétence.La lisibilité, facilité d'utilisation et la simplicité aurait besoin de plus de considération dans le dernier cas.Aucun sens de l'ultime moquerie cadre si beaucoup de gens finissent par ne pas l'utiliser ou de ne pas maintenir les tests.

Nous sommes fortement en utilisant EasyMock et EasyMock Extension de Classe au travail et sont très heureux avec elle.Essentiellement, il vous donne tout ce dont vous avez besoin.Jetez un oeil à la documentation, il y a un très bel exemple qui vous montre toutes les caractéristiques d'EasyMock.

J'ai utilisé JMock tôt.J'ai essayé de Mockito à mon dernier projet, et il aimait.Plus concis, plus propre.PowerMock couvre tous les besoins, qui sont absentes dans Mockito, comme se moquant d'un code statique, se moquant d'un création de l'instance, se moquant de finale de classes et de méthodes.J'ai donc en tout j'en ai besoin pour faire mon travail.

J'aime JMock parce que vous êtes en mesure de définir les attentes.C'est totalement différent de vérifier si une méthode a été appelée trouvé dans certains se moquer de bibliothèques.À l'aide de JMock vous pouvez écrire très sophistiqué attentes.Voir la jmock cheat-mémoire.

Oui, Mockito est un grand cadre.- Je l'utiliser avec hamcrest et Google guice pour l'installation de mes tests.

La meilleure solution pour se moquant est d'avoir la machine faire tout le travail automatisés en fonction de spécification de test.Pour Java, voir ScalaCheck et la Reductio cadre inclus dans le Fonctionnel Java de la bibliothèque.Avec automatisée spécification des tests basés sur des cadres, vous fournir une spécification de la méthode d'essai (une propriété qui doit être vrai) et le cadre génère de tests ainsi que les objets fantaisie, automatiquement.

Par exemple, la propriété suivante des tests de Mathématiques.méthode sqrt pour voir si la racine carrée d'un nombre positif n au carré est égal à 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 chaque, automatiquement vous assurant que les cas limites sont bien couvert.

Même si ScalaCheck est écrit en Scala, et exige que le Compilateur Scala, il est facile de tester du code Java avec elle.La Reductio cadre Fonctionnel Java est un pur Java mise en œuvre de ces mêmes concepts.

Mockito offre également la possibilité de cogner les méthodes d'appariement des arguments (comme anyInt() et anyString()), en vérifiant le nombre d'invocations ((3) fois, atLeastOnce(), jamais()), et plus.

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

Une chose que je n'aime pas à propos de Mockito est que vous ne peut pas stub méthodes statiques.

Pour quelque chose d'un peu différent, vous pouvez utiliser JRuby et Moka qui sont combinés dans JtestR écrire des tests pour votre code Java dans expressif et succincte Ruby.Il y a certains se moquant des exemples avec JtestR ici.Un avantage de cette approche est de moquer les classes de béton est très simple.

J'ai commencé à utiliser les objets fantaisie, par le biais de JMock, mais finalement transféré à utiliser EasyMock.EasyMock était juste que, --et plus facile-- et a fourni une syntaxe qui se sentait de plus naturel.Je n'ai pas adopté depuis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top