使用非聚合事件测试 Axon 聚合的行为
Test Axon aggregate's behaviour with non-aggregate events
我试图确保聚合字段在创建时是唯一的。我正在尝试使用以下流程处理预测的最终一致性:
- 命令创建一个新聚合
- 聚合问题创建事件
- 事件处理程序尝试具体化投影,如果存在唯一性违规,它会发出
UniqueConstraintViolationEvent
- 聚合使用此事件并将其自身标记为已删除
我正在尝试使用 AggregateTestFixture
来测试它,但它似乎不允许您在不发出命令的情况下执行任何断言(whenThenTimeElapses
似乎允许断言,但是当断言聚合已被删除时,我得到了一个 NPE)。有没有一种方法可以在这种情况下使用测试夹具,或者它不是为了解决非聚合事件而设计的。如果没有,是否有另一种方法来验证聚合已被删除?
我不确定这是否是正确的方法。我还考虑过在 (3) 中分派命令或使用 saga 来管理交互。如果我发送命令而不是事件,它似乎只是迫使我编写更多样板文件以从聚合中发出 UniqueConstraintViolationEvent
。同样,如果我使用 saga 来模拟此交互,我不确定如何结束 saga 的生命周期而不让投影物化器发出 saga 消耗的成功事件。
您正在查看一个基于集合的验证方案,在处理 CQRS 系统时这会稍微麻烦一些。 blog 很好地解释了您的一些选项,因此我会从那里挑选。
作为准则的一种形式,请注意聚合保护 它自己的 一致性边界。因此,不可取地通过断言整个聚合集合之间的唯一性来扩展该边界。简单地说,不是单个聚合实例的问题。
因此,我会在发出命令之前通过查询包含所需约束的轻量级查询模型来执行此唯一性检查。
我试图确保聚合字段在创建时是唯一的。我正在尝试使用以下流程处理预测的最终一致性:
- 命令创建一个新聚合
- 聚合问题创建事件
- 事件处理程序尝试具体化投影,如果存在唯一性违规,它会发出
UniqueConstraintViolationEvent
- 聚合使用此事件并将其自身标记为已删除
我正在尝试使用 AggregateTestFixture
来测试它,但它似乎不允许您在不发出命令的情况下执行任何断言(whenThenTimeElapses
似乎允许断言,但是当断言聚合已被删除时,我得到了一个 NPE)。有没有一种方法可以在这种情况下使用测试夹具,或者它不是为了解决非聚合事件而设计的。如果没有,是否有另一种方法来验证聚合已被删除?
我不确定这是否是正确的方法。我还考虑过在 (3) 中分派命令或使用 saga 来管理交互。如果我发送命令而不是事件,它似乎只是迫使我编写更多样板文件以从聚合中发出 UniqueConstraintViolationEvent
。同样,如果我使用 saga 来模拟此交互,我不确定如何结束 saga 的生命周期而不让投影物化器发出 saga 消耗的成功事件。
您正在查看一个基于集合的验证方案,在处理 CQRS 系统时这会稍微麻烦一些。 blog 很好地解释了您的一些选项,因此我会从那里挑选。
作为准则的一种形式,请注意聚合保护 它自己的 一致性边界。因此,不可取地通过断言整个聚合集合之间的唯一性来扩展该边界。简单地说,不是单个聚合实例的问题。
因此,我会在发出命令之前通过查询包含所需约束的轻量级查询模型来执行此唯一性检查。