如何解决如何测试不产生事件的状态存储聚合
我想使用 AggregateTestFixture 测试状态存储的聚合。但是我收到 AggregateNotFoundException: No 'given' events were configured for this aggregate,nor have any events been stored.
错误。
我在命令处理程序中更改聚合的状态并且不应用任何事件,因为我不希望域条目表不必要地增长。
这是我用于聚合的外部命令处理程序;
open class AllocationCommandHandler constructor(
private val repository: Repository<Allocation>,) {
@CommandHandler
fun on(cmd: CreateAllocation) {
this.repository.newInstance {
Allocation(
cmd.allocationId
)
}
}
@CommandHandler
fun on(cmd: CompleteAllocation) {
this.load(cmd.allocationId).invoke { it.complete() }
}
private fun load(allocationId: AllocationId): Aggregate<Allocation> =
repository.load(allocationId)
}
这是总和;
@Entity
@Aggregate
@Revision("1.0")
final class Allocation constructor() {
@AggregateIdentifier
@Id
lateinit var allocationId: AllocationId
private set
var status: AllocationStatusEnum = AllocationStatusEnum.IN_PROGRESS
private set
constructor(
allocationId: AllocationId,) : this() {
this.allocationId = allocationId
this.status = AllocationStatusEnum.IN_PROGRESS
}
fun complete() {
if (this.status != AllocationStatusEnum.IN_PROGRESS) {
throw IllegalArgumentException("cannot complete if not in progress")
}
this.status = AllocationStatusEnum.COMPLETED
apply(
AllocationCompleted(
this.allocationId
)
)
}
}
此聚合中没有 AllocationCompleted 事件的事件处理程序,因为它被另一个聚合侦听。
这里是测试代码;
class AllocationTest {
private lateinit var fixture: AggregateTestFixture<Allocation>
@Before
fun setUp() {
fixture = AggregateTestFixture(Allocation::class.java).apply {
registerAnnotatedCommandHandler(AllocationCommandHandler(repository))
}
}
@Test
fun `create allocation`() {
fixture.givenNoPriorActivity()
.`when`(CreateAllocation("1")
.expectSuccessfulHandlerExecution()
.expectState {
assertTrue(it.allocationId == "1")
};
}
@Test
fun `complete allocation`() {
fixture.givenState { Allocation("1"}
.`when`(CompleteAllocation("1"))
.expectSuccessfulHandlerExecution()
.expectState {
assertTrue(it.status == AllocationStatusEnum.COMPLETED)
};
}
}
create allocation
测试通过,complete allocation
测试出现错误。
解决方法
givenNoPriorActivity
实际上不打算与状态存储聚合一起使用。最近对 AggregateTestFixture
进行了调整以支持此功能,但将随 Axon 4.6.0(当前最新版本为 4.5.1)一起发布。
然而,这并没有改变我觉得 complete allocation
测试失败很奇怪的事实。使用 givenState
和 expectState
方法是可行的方法。也许 Kotlin/Java 组合现在正在发挥作用;你有没有试过用纯 Java 做同样的事情,只是为了确定?
无论如何,您共享的异常来自 RecordingEventStore
内的 AggregateTestFixture
。仅当在幕后(由装置)实际使用事件源存储库时才会发生这种情况,因为这将读取事件。 可能的罪魁祸首是 givenNoPriorActivity
的使用。请尝试将其替换为提供空聚合实例的 givenState()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。