我正在尝试测试聚合,并想断言固定装置之外的事件,甚至可能使用 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)
合理的问题@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!