FEST-Assert : assertThat(collection).eachSatifies(condition)

FEST-Assert est un framework permettant d’écrire des assertions via un DSL Java, au sein de vos tests JUnit ou TestNG.

FEST-Assert se positionne en alternative à Hamcrest, en proposant une API plus fluide, et favorisant l’auto-complétion par rapport aux imports statiques.

Un exemple très simple :


1
2
3
4
5
6
7
8
// JUnit
assertEquals(expected, actual);

// Hamcrest
assertThat(actual, equalTo(expected));

// FEST-Assert
assertThat(actual).isEqualTo(expected);


FEST-Assert propose des assertions dédiées aux collections, mais qui ne s’appliquent qu’aux propriétés globales d’une collection, par exemple :


1
2
3
4
assertThat(fellowshipOfTheRing)
    .hasSize(9)
    .contains(frodo, sam)
    .excludes(sauron);

Heureusement, il est tout à fait possible d’étendre FEST-Assert pour proposer ses propres assertions. C’est d’ailleurs l’objet de ce labs : une classe d’assertion pour vérifier que tous les éléments d’une collection valident une condition.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Etend IteratorAssert pour donner accès aux méthodes exposées par celui-ci (contains(), etc).
public class IterableAssert<T> extends IteratorAssert {
   
    public static <T> IterableAssert<T> assertThat(Iterable<T> actual) {
        return new IterableAssert<T>(actual);
    }

    private final Iterable<T> actualIterable;

    public IterableAssert(Iterable<T> actual) {
        super(actual.iterator());
        actualIterable = actual;
    }
   
    public IterableAssert<T> eachSatisfies(Condition<T> condition) {
       
        long notMatching = 0;
        StringBuilder notMatchingDescription = new StringBuilder();
        long index = 0;
        for (T value : actualIterable) {
            if (!condition.matches(value)) {
                notMatching++;
                notMatchingDescription //
                        .append("Element ") //
                        .append(index) //
                        .append(", [") //
                        .append(value.toString()) //
                        .append("] does not match condition: ") //
                        .append(condition.description()) //
                        .append("\n") //
                ;
            }
            index++;
        }

        if (notMatching == 0) {
            return this;
        }

        failIfCustomMessageIsSet();
        throw failure(notMatching + " element(s) in the iterable not matching the provided condition:\n" + notMatchingDescription.toString());
    }

}

Dès lors, il est possible de faire :


1
2
3
4
5
6
assertThat(ageList).eachSatisfies(new Condition<Integer>() {
    @Override
    public boolean matches(Integer value) {
        return value >= 18;
    }
});

Peut-être commencez-vous à voir où je veux en venir ;-)

Un ptit coup de FunkyJFunctional, et le code est encore plus magique !


1
2
class Majeur extends Cond<Integer> {{ r = t >= 18; }}
assertThat(ageList).eachSatisfies(Majeur.class);

La version funky de IterableAssert propose aussi une méthode noneSatisfies(condition). Merci à Nicolas François pour l’implémentation funky du Condition de FEST-Assert.

VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share

À propos de Pierre-Yves Ricau

Découvrez mon cv dynamique en ligne !
Ce contenu a été publié dans Non classé. Vous pouvez le mettre en favoris avec ce permalien.

Une réponse à FEST-Assert : assertThat(collection).eachSatifies(condition)

  1. Sympa! Effectivement, la syntaxe est plus agréable que celle d’Hamcrest. A voir toutefois si cette librairie va être aussi largement adoptée.

    VN:R_U [1.9.22_1171]
    Rating: 0 (from 0 votes)

Laisser un commentaire