Documentation de la version 2.3 (December 26 2007)
© 2003-2007 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.
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.
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.
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.
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.
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".
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.