【发布时间】:2018-11-15 15:02:00
【问题描述】:
假设我有一个聚合,对于某些操作,需要存在另一个聚合。假设我有一个car 和一个garage。可能有一个名为ParkInGarage 的命令如下所示:
public class ParkInGarage {
@TargetAggregateIdentifier
public final UUID carId;
public final Garage garage;
//... constructor omitted
}
我 read 表示要验证聚合的存在,最好在命令中使用加载的聚合,因为这已经暗示了它的存在(而不是传递 garageId)。
现在,当使用Axon's fixtures 对Car 进行单元测试时,我不能简单地通过说new Garage(buildGarageCmd) 来实例化我的Garage。它会说:
java.lang.IllegalStateException:如果没有活动范围,则无法请求当前范围
因为没有设置基础设施。 我将如何测试这种情况,还是应该以不同的方式设计聚合?
抽象的真实示例
我正在使用的聚合根可能具有对自身的引用,以形成所述聚合根的树结构。我们就叫它Node吧。
@Aggregate
public class Node {
private Node parentNode;
}
创建后,我可以将Optional<Node> 作为父级传递,或者稍后使用单独的命令设置父级。是否应该将父级定义为实例或 ID 是问题的一部分。
public class AttachNodeCmd {
@TargetAggregateIdentifier
public final UUID nodeId;
public final Optional<Node> parentNode;
}
在命令处理程序中,我需要检查将节点附加到给定父节点是否会引入循环(结构应该是树,而不是公共图)。
@CommandHandler
public Node(AttachNodeCmd command) {
if (command.parentNode.isPresent()) {
Node currentNode = command.parentNode.get();
while (currentNode != null) {
if (currentNode.equals(this)) throw new RecursionException();
currentNode = currentNode.parentNode.orElse(null);
}
}
//Accept the command by applying() an Event
}
在某些时候,需要实例化父级以执行这些检查。这可以通过在命令中提供聚合实例来完成(不鼓励),或者通过向命令处理程序提供Repository<Node> 和nodeId 来完成,这是聚合本身,也是不鼓励的。目前我还没有找到正确的方法来做这件事,并且还没有进一步测试的方法。
【问题讨论】:
标签: unit-testing domain-driven-design aggregateroot axon