Pages

jeudi 15 mai 2014

Les assertions avec AssertJ... c'est pour maintenant...

Je voulais compléter mon article sur les asserts en parlant de AssertJ.  J'ai déjà présenté rapidement AssertJ dans un article mais à l'époque (il y a un an) je ne conseillais pas de partir sur ce framework d'assertion.  J'utilisais beaucoup fest-assert mais la version 2 tarde à sortir et AssertJ a l'air beaucoup plus vivant et propose pas mal de nouveautés intéressantes. En regardant un peu sur le web j'ai pu constater que je n'étais pas le seul à avoir fait le changement (voir par exemple cet article de David Gageot).

Vous pourriez me demander ok mais tu as un exemple pour me dire que c'est le truc à appliquer sur mon projet ?

Prenons l'exemple d'un test qui retourne une liste de conférences. Pour valider la liste retournée je vérifie que les noms retournés correspondent bien à ceux que j'attends. Avec Junit et Mockito j'écrirai

    @Test
    public void testTheHypestConfOK() throws Exception {

        // Construction de la liste des confererences attendues
        Conference devoxx2014 = new Conference("Devoxx2014", 154L, 658L, 2820L);
        Conference mixit2014 = new Conference("Mix-IT2014", 30L, 200L, 845L);
        conferences.add(devoxx2014);
        conferences.add(mixit2014);

        when(conferenceRepository.findAll()).thenReturn(conferences);
        List<Conference> theHypestConfs = defaultFavoriteService.getTheHypestConfs();
        // Verification du resultat
        List<String> confNames = new ArrayList<String>();
        for (Conference conf : theHypestConfs) {
            confNames.add(conf.getName());
        }
        List<String> expected = Arrays.asList("Mix-IT2014", "Devoxx2014");
        assertEquals(expected, confNames);

    }

Mais avec AssertJ, je peux simplifier les assertions et avoir  le code suivant

    @Test
    public void testTheHypestConfOK2() throws Exception {

        // Construction de la liste des confererences attendues
        Conference devoxx2014 = new Conference("Devoxx2014", 154L, 658L, 2820L);
        Conference mixit2014 = new Conference("Mix-IT2014", 30L, 200L, 845L);
        conferences.add(devoxx2014);
        conferences.add(mixit2014);

        when(conferenceRepository.findAll()).thenReturn(conferences);
        assertThat(defaultFavoriteService.getTheHypestConfs())
                .extracting("name")
                .containsExactlyElementsOf(Arrays.asList("Mix-IT2014", "Devoxx2014"));

    }

C'est tout de même plus simple non ? Je pourrai prendre tout un tas d'exemple mais je vous laisse consulter le site de  Joel Costigliola créateur de AssertJ qui propose ces exemples.

La force de AssertJ (tout comme fest-assert) est de vous donner la possibilité de créer vos propres classes d'assertions. Par exemple

public class FrameworkAssert extends AbstractAssert<FrameworkAssert, Framework> {

    protected FrameworkAssert(Framework actual) {
        super(actual, FrameworkAssert.class);
    }

    /**
     * an entry point for FrameworkAssert
     */
    public static FrameworkAssert assertThat(Framework actual) {
        return new FrameworkAssert(actual);
    }


    /**
     * Vérifie que les champs de la clé fonctionnelle sont renseignés
     */
    public FrameworkAssert hasUniqueKey() {
        Assertions.assertThat(actual.getName()).overridingErrorMessage("Name is required").isNotNull();
        Assertions.assertThat(actual.getVersion()).overridingErrorMessage("Version is required").isNotNull();
        Assertions.assertThat(actual.getLanguage()).overridingErrorMessage("Language is required").isNotNull();
        return this;
    }
}

Voila pouvez maintenant tester de vous même et il faut simplement garder à l'esprit que plus le code de vos tests sera simple plus ils seront lisibles et viables dans le temps.

1 commentaire:

  1. A mon avis tu peux meme écrire

    assertThat(defaultFavoriteService.getTheHypestConfs())
    .extracting("name")
    .containsExactly("Mix-IT2014", "Devoxx2014");

    Il est aussi possible de générer ses propres classes d'assertions avec le générateur d'assertions, ca permet d'avoir tout un tas d'assertions rapidement et pour pas cher, cf http://joel-costigliola.github.io/assertj/assertj-assertions-generator.html

    Joel

    RépondreSupprimer

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.