Jusqu’à présent, lorsqu’il s’agissait de créer des mocks pour les tests unitaires, j’utilisais JMock. On m’avait déjà parlé de Mockito et de ses avantages: simplicité d’écritures des mocks, API simple => tests plus lisibles et donc plus simples à maintenir.
Après des détails aussi alléchant, j’ai enfin décidé d’étudier Mockito histoire de voir ce que ce dernier avait dans le ventre… Et pour le coup, je dois reconnaitre que le résultat est plutôt pas mal!!
En effet, comme on me l’avait souligné, la simplicité d’utilisation de l’API est impressionante. Elle l’est dautant plus lorsqu’on a passé des mois entiers à utiliser des frameworks plus lourds (en écriture) tels que JMock ou encore Easymock.
Personnellement, le problème que j’ai avec JMock est lié à l’écriture d’Annonymous Inner Type qui, à mon sens, complexifient inutilement le test unitaire. Un test doit rester simple!!! En effet, plus il sera simple, plus il sera facile à maintenir. C’est pour cette raison que ma préférence va désormais à Mockito…
Pour illustrer ce que je viens de vous dire, voici un exemple de tests unitaires: le premier est écrit avec JMock et le deuxième avec Mockito. Je vous laisse observer et vous faire votre propre opinion!!!
public class MyTest {
private Mockery mockery;
@Before
public void before() throws Exception {
this.mockery = new Mockery();
}
// Unit tests using JMock framework
@Test
public void echoWithJMock() throws Exception {
final String parameter = "Hello World!!!";
final EchoService echoService = this.mockery.mock(EchoService.class);
// Boring anonymous inner type
Expectations expectations = new Expectations() {{
one(echoService).echo(parameter);
will(returnValue(parameter));
}};
// Registers expectations
this.mockery.checking(expectations);
// Test assertion
assertEquals(parameter, echoService.echo(parameter));
// Fails the test if there are any expectations that have not been met.
this.mockery.assertIsSatisfied();
}
// Unit tests using Mockito framework
@Test
public void echoWithMockito() throws Exception {
String parameter = "Hello World!!!";
// More beautiful code: No boring anonymous inner types to define!!!
EchoService echoService = mock(EchoService.class);
when(echoService.echo(parameter)).thenReturn(parameter);
// Test assertion
assertEquals(parameter, echoService.echo(parameter));
// Fails the test if the method is called more than once
verify(echoService).echo(parameter);
}
// Service to be mocked: EchoService
private interface EchoService {
String echo(String message);
}
}
Pour plus d’information sur Mockito, rendez-vous à cette adresse.
Bon code à tous!!!
–
Benjamin Sempéré
