EasyMock.
@RunWith(UnitilsJUnit4TestClassRunner.class) public class AlbumsResourceUTest { // Objet du test @TestedObject AlbumsResource albumsResource;
// Mock + injection dans l'objet du test @RegularMock @InjectIntoByType AlbumService albumService;
// Mock + injection dans l'objet du test @RegularMock @InjectIntoByType UriInfo uriInfo;
// Simple mock @Mock UriBuilder uriBuilder; [...] }
Easymock permet en un minimum de code de disposer d'objet mocké que l'on va pouvoir maîtriser afin de mener à bien nos tests. Pour information, la méthode EasyMock.expect(…)
permet de valider l'utilisation des objets mockés (nombre d'appel, arguments, …) tout en manipulant leur comportement.
Ce test permet de valider le comportement nominal du service. Il vérifie la réponse de la ressource, le code retour ainsi que l'appel à la méthode sous-jacente albumService.save()
.
@Test public void postAlbumNominalCase() throws URISyntaxException { // Setup Album album = new Album(); album.setTitle("In Rainbows"); album.setId(new Long(32)); albumXmlBean.setTitle("In Rainbows"); albumXmlBean.setId(album.getId()); URI expectedUri = new URI("http://test");
// Mock expectations albumService.save(album); EasyMock.expect(uriInfo.getAbsolutePathBuilder()).andReturn(uriBuilder); EasyMock.expect(uriBuilder.path(album.getId().toString())).andReturn(uriBuilder); EasyMock.expect(uriBuilder.build()).andReturn(expectedUri); EasyMockUnitils.replay();
// Test Response response = albumsResource.postAlbum(albumXmlBean);
// Asserts assertEquals(Status.CREATED.getStatusCode(), response.getStatus()); AlbumXmlBean returnedAlbumXmlBean = (AlbumXmlBean) response.getEntity(); assertTrue(response.getMetadata().containsKey("Location"));
URI returnedUri = (URI) response.getMetadata().get("Location").get(0); assertEquals(expectedUri, returnedUri); assertEquals(albumXmlBean, returnedAlbumXmlBean);
Il est dès lors possible de construire tous les cas de test en pilotant ces mocks. Par exemple le test suivant valide qu’à la levée d’une exception AlbumAlreadyExistsException
, le web service renvoie un code retour CONFLICT (409) :
Les tests unitaires sur un service web permettent de tester en isolation une ressource (sans Spring + Hibernate + Jaxb + Jersey). Quand on connait le contexte que traine chacun de ces frameworks, on s'aperçoit qu'on arrive à tester au maximum notre ressource de manière simple (manipulation de POJOs). Ces tests seront d’autant plus fréquemment rejoués qu’ils sont rapides à exécuter et participeront donc à la qualité générale de l’application. A travers ces tests, il est possible de valider que la ressource mise en place est conforme aux intentions du développeur :
Le test unitaire est le premier maillon du harnais de tests. Nous verrons dans les articles suivants dans quelle mesure les tests d'intégration et les tests de recette participent eux aussi à la mise en place d'une stratégie de test efficace.
Rq : Vous pouvez me contacter si vous désirez le code complet de RESTune