如何测试不产生事件的状态存储聚合

时间:2021-05-28 11:31:02

标签: spring-boot hibernate kotlin jpa axon

我想使用 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 测试出现错误。

1 个答案:

答案 0 :(得分:0)

givenNoPriorActivity 实际上不打算与状态存储聚合一起使用。最近对 AggregateTestFixture 进行了调整以支持此功能,但将随 Axon 4.6.0(当前最新版本为 4.5.1)一起发布。

然而,这并没有改变我觉得 complete allocation 测试失败很奇怪的事实。使用 givenStateexpectState 方法是可行的方法。也许 Kotlin/Java 组合现在正在发挥作用;你有没有试过用纯 Java 做同样的事情,只是为了确定?

无论如何,您共享的异常来自 RecordingEventStore 内的 AggregateTestFixture。仅当在幕后(由装置)实际使用事件源存储库时才会发生这种情况,因为这将读取事件。 可能的罪魁祸首是 givenNoPriorActivity 的使用。请尝试将其替换为提供空聚合实例的 givenState()