Documentation de la version 2.5.2 (2009-12-20)
© 2003-2009 OFFIS, Henri Tremblay.
Documentation traduite originellement de l'anglais par Alexandre de Pellegrin. Maintenue par Henri Tremblay.
EasyMock Class Extension permet de générer des Mock Objects à partir de classes.
Pour générer des Mock Objects de classes et d'interfaces, utilisez
import static org.easymock.classextension.EasyMock.*;
au lieu de
import static org.easymock.EasyMock.*;
Vous pourrez ensuite créer un Mock Object, de la même façon qu'avec EasyMock, en faisant quelque chose comme:
ToMock mock = createMock(ToMock.class);
A partir de là, vous pouvez utiliser votre mock comme vous le faisiez avec EasyMock. Notez que les
méthodes createNiceMock
, createStrictMock
,
createStrictControl
, createControl
and
createNiceControl
sont aussi disponibles. Les méthodes create...Control()
retournent un object de type org.easymock.classextension.IMocksControl
, une extension de
la classe IMocksControl
d'EasyMock. Finalement, org.easymock.classextension.EasyMockSupport
fournit une implémentation de EasyMockSupport
fonctionnant pour la class extension.
Dans certains cas, vous pouvez avoir besoin de "mocker" uniquement certaines méthodes d'une classe et de conserver un comportement normal pour les autres. Cela arrive habituellement lorsque pour souhaitez tester une méthode appelant d'autres méthodes de la même classe. Vous voulez donc garder le comportement normal de la méthode testée et "mocker" les autres.
Dans ce cas, la premier réflexe à avoir est d'envisager un refactoring car, bien souvent, ce problème est la conséquence d'un mauvais design. Si ce n'est pas le cas ou si vous ne pouvez faire autrement pour une quelconque contrainte de développement, voici la solution:
ToMock mock = createMockBuilder(ToMock.class) .addMockedMethod("mockedMethod").createMock();
Seules les méthodes ajoutées avec addMockedMethod(s)
seront
"mockées" (mockedMethod()
dans l'exemple). Les autres conservent leur
comportement habituel. Une exception: les méthodes abstraites sont "mockées" par défaut.
createMockBuilder
retourne l'interface IMockBuilder
. Elle contient
diverses méthodes pour facilement créer un mock partiel. Jettez un coup d'oeil à la javadoc
pour en savoir plus.
Remarque: EasyMock fournit un comportement par défault pour les méthodes de la classe Object (equals, hashCode, toString). Toutefois, pour un mock partiel, si ces méthodes ne sont pas mockées explicitement, elles auront leur comportement normal et non celui par défaut d'EasyMock.
Il est possible de créer un mock en appelant un constructeur de la classe. Ceci peut être utile lorsqu'une méthode doit être testée mais d'autres dans la même classe "mockées". Pour cela vous devez faire quelque chose comme
ToMock mock = createMockBuilder(ToMock.class) .withConstructor(1, 2, 3); // 1, 2, 3 sont les paramètres passés au constructeur
Voir ConstructorCalledMockTest
pour un exemple d'utilisation.
Parfois (habituellement à cause d'une JVM non supportée), il est possible que EasyMock CE ne soit pas capable de créer un mock dans votre environnement java. Sous le capot, l'instantiation de classes est implémentée par un pattern "factory". En cas de problème, vous pouvez remplacer l'instantiateur par défaut avec:
DefaultClassInstantiator
qui fonctionne très bien avec les classes
sérializable et sinon tente de deviner quel constructeur appeler et quels paramètres lui passer.IClassInstantiator
.
Vous assignez ce nouvel instantiateur à l'aide de ClassInstantiatorFactory.setInstantiator()
.
Vous pouvez remettre celui par défaut avec setDefaultInstantiator()
.
Important: L'instantiateur est gardé statiquement et reste donc entre deux tests. Assurez-vous de le réinitialiser si nécessaire.
Une class mockée peut aussi être sérializé. Toutefois, comme celle-ci étant une classe sérializable,
cette dernière peut avoir un comportement spécial dû à l'implémentation de méthodes tels
que writeObject
. Ces méthodes seront toujours appelées lorsque le mock sera sérializé
et peuvent potentiellement échouer. Habituellement, le contournement consiste à créer le mock
en appelant un constructeur.
Aussi, il est possible que la dé-sérialization d'un mock ne fonctionne pas si elle est effectuée dans un class loader différent de la sérialization. Ce cas n'a pas été testé.
Le jar d'EasyMock CE jar oeut être utilisé comme bundle OSGi. It exporte les packages
org.easymock.classextension
et org.easymock.classextension.internal
.
Toutefois, pour importer le dernier, il faut spécifier l'attribut poweruser
à true
(poweruser=true
). cglib est aussi exporté pour permettre aux Mock Objects de fonctionner
correctement.
EasyMock Class Extension fournit un comportement par défaut pour equals()
,
toString()
et hashCode()
. Cela signifie que vous ne pourrez
enregistrer votre propre comportement pour ces méthodes. Cette limitation est
cohérente avec ce
qu'EasyMock fait. Elle doit être considérée comme une
fonctionnalité permettant ne ne pas s'occuper de ces
méthodes.
Les méthodes finales ne peuvent pas être "mockées". Si appelées, leur code normal sera exécuté.
L'instantiation des classes est faite par Objenesis. Les JVMs supportées sont listées ici.
Dans la section Utilisation avancée, il a été expliqué comment faire un mock partiel. Une chose importante à savoir est que les méthodes privées ne sont jamais "mockées". De ce fait, si votre méthode tester appelle des méthodes privées, vous devrez les tester dans la foulée puisque vous ne pourrez pas les "mocker".
EasyMock Class Extension est présentement maintenue par Henri Tremblay.
Elle a été initialement développée par Joel Shellman, Chad Woolley et Henri Tremblay dans la section fichiers du of Yahoo!Groups.
Remerciements à ceux qui nous ont fourni retour d'expérience et rustines, incluant Rodrigo Damazio, Bruno Fonseca, Ben Hutchison, et de nombreux autres.
Nouveau dans la version 2.5.2:
Nouveau dans la version 2.5.1:
Nouveau dans la version 2.5:
Nouveau dans la version 2.4:
Nouveau dans la version 2.3:
Nouveau dans la version 2.2.2:
Nouveau dans la version 2.2.1:
Nouveau dans la version 2.1:
Nouveau dans la version 2.0: