有没有一种方法可以直接从测试装置测试事件而不使用expectEvents?

vce*_*ick 3 axon

我正在尝试测试聚合,并想断言固定装置之外的事件,甚至可能使用 Hamcrest 进行评估?

使用时间戳的示例

        fixture.given()
           .when(new UserCreateCommand("1","test@bob.com"))
           .expectEvents(new UserCreatedEvent("1","test@bob.com");
Run Code Online (Sandbox Code Playgroud)

该夹具允许我轻松地测试相等性,例如该命令准确地生成此事件,如果我想说引入事件创建时间的时间戳,那么它就不那么容易了

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

这种期望永远不会起作用,因为 LocalDateTime.now() 永远不会精确等于聚合中生成的时间戳。

我可以简单地将时间戳包含在命令有效负载中,但更喜欢在聚合内部进行处理,以确保以一致的方式生成此时间戳。

有没有办法从夹具中检索事件以独立于夹具进行断言,例如

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

这将允许我使用其他断言库,例如 hamcrest:

例如

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

Run Code Online (Sandbox Code Playgroud)

Ste*_*ven 5

合理的问题@vcetinick!

实际上,您应该能够将匹配器与 Axon 的聚合测试装置一起使用。结果验证部分AggregateTestFixture提供了expectEventsMatching(Matcher<? extends List<? super EventMessage<?>>> matcher)方法。顺便说一句,您可以在这里找到相关代码。

在此 Axon 框架之上,提供了一组合理的匹配器,您可以将其用于一般消息,这些匹配器分组在实用程序类下Matchers(您可以在此处找到)。

完成所有这些后,您应该能够执行以下操作:

@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
                                   })
                           )
                   )
           );
}
Run Code Online (Sandbox Code Playgroud)

Matchers如果您愿意,您基本上可以在其中配对任意数量的方法。

希望这能回答您的问题@vcetinick!