J'essaie de tester un agrégat et j'aimerais affirmer les événements en dehors du luminaire et peut-être même utiliser Hamcrest pour évaluer?

Un exemple d'utilisation d'horodatages

        fixture.given()
           .when(new UserCreateCommand("1","test@bob.com"))
           .expectEvents(new UserCreatedEvent("1","test@bob.com");

Le luminaire me permet de tester facilement l'égalité, par ex. la commande produit exactement cet événement, ce n'est pas si facile si je voulais dire introduire un horodatage du moment où l'événement a été créé par exemple

        fixture.given()
           .when(new UserCreateCommand("1","test@bob.com"))
           .expectEvents(new UserCreatedEvent("1","test@bob.com", LocalDateTime.now());

Cette attente ne fonctionnera jamais car LocalDateTime.now() ne sera jamais exactement égal à l'horodatage généré dans l'agrégat.

Je pourrais simplement inclure l'horodatage dans la charge utile de la commande, mais ressentir une préférence à gérer à l'intérieur de l'agrégat pour garantir une manière cohérente de générer ces horodatages.

Existe-t-il un moyen de récupérer l'événement hors du projecteur pour l'affirmer indépendamment du projecteur, par ex.

   UserCreatedEvent uce = fixture.given()
           .when(new UserCreateCommand("1","test@bob.com"))
           .extractEvent(UserCreatedEvent.class)

Cela me permettrait alors d'utiliser d'autres librairies d'assertions comme hamcrest par exemple :

Par exemple.

   assertThat(uce.getCreatedAt(), is(greaterThanOrEqualto(LocalDateTime.now().minusSeconds(1);

2
vcetinick 6 nov. 2020 à 16:58

1 réponse

Meilleure réponse

Question raisonnable @vcetinick !

Vous devriez réellement pouvoir utiliser des matchers avec les appareils de test agrégés d'Axon. La partie validation des résultats de AggregateTestFixture fournit la méthode expectEventsMatching(Matcher<? extends List<? super EventMessage<?>>> matcher). Vous pouvez trouver le code pour ce ici d'ailleurs.

En plus de cela, Axon Framework fournit un ensemble de matchers raisonnables que vous pouvez utiliser pour les messages en général, regroupés sous la classe d'utilitaires Matchers (que vous pouvez trouver ici).

Avec tout cela en place, vous devriez pouvoir faire quelque chose comme ceci :

@Test
void sampleTest() {
    FixtureConfiguration<SampleAggregate> fixture = 
        new AggregateTestFixture<>(SampleAggregate.class);
    fixture.givenNoPriorActivity()
           .when(new UserCreateCommand("1","test@bob.com"))
           .expectEventsMatching(
                   Matchers.exactSequenceOf(
                           Matchers.messageWithPayload(
                                   Matchers.matches(payload -> {
                                       // Your UserCreatedEvent validation 
                                       //  disregarding the time stamp here
                                   })
                           )
                   )
           );
}

Vous pouvez essentiellement associer n'importe quel nombre de méthodes Matchers dans leur si vous le souhaitez.

En espérant que cela réponde à votre question @vcetinick !

1
Steven 12 nov. 2020 à 13:11