EasyMock Class Extension 2.4 Readme

Documentation de la version 2.4 (August 30 2008)
© 2003-2008 OFFIS, Henri Tremblay.

Traduit 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.

Pré-requis

EasyMock Class Extension nécessite
Java 5 ou supérieur, EasyMock 2.4, cglib 2.1 (2.0.x fonctionne également mais ne permet pas de "mocker" une classe sans constructeur visible), asm (utilisez la version appropriée pour votre version de cglib; vous pouvez aussi prendre cglib-nodep-2.1.jar qui inclut asm) et JUnit 4 pour éxécuter les tests.

Utilisation

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, 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.

Utilisation avancée

Mocking partiel

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 = createMock(ToMock.class, 
   ToMock.class.getMethod("mockedMethod", null));

Seules les méthodes passées à createMock 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.

La version d'IMocksControl d'EasyMock class extension fournit aussi une méthode createMock() pour créer des mocks partiels.

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.

Test interne d'une classe

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 appelez createMock() en passant un ConstructorArgs. Voir ConstructorCalledMockTest pour un exemple d'utilisation.

Remplacer l'instantiateur par défaut

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:

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.

Limitations

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éesSupported 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".

Déeveloppement

Auteurs

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.

Notes de mises à jour

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: