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?
Réponses
Trop de publicités?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.
Je suis le créateur de PowerMock alors, évidemment, je recommande! :-)
PowerMock s'étend à la fois EasyMock et Mockito avec la capacité à se moquer de méthodes statiques, finale 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.
Le JMockit projet site contient beaucoup d'informations comparatives pour le courant se moquant de boîtes à outils.
En particulier, vérifier la fonctionnalité de comparaison de la matrice, qui couvre EasyMock/EasyMock CE, 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 (voir https://java.net/projects/jmockit/)
C'est assez nouveau, et donc c'est un peu brut et sous-documenté. Il utilise asm (http://asm.objectweb.org/index.html) de façon dynamique redéfinir le bytecode de la classe, de sorte qu'il peut se moquer de toutes les méthodes, y compris de la statique, des privés, 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
les classes.