代码之家  ›  专栏  ›  技术社区  ›  Double M

如何实例化聚合以测试其他聚合?

  •  1
  • Double M  · 技术社区  · 6 年前

    假设我有一个聚合,对于某些操作,它需要存在另一个聚合。让我们假设我有一个 car garage . 可能有一个名为 ParkInGarage

    public class ParkInGarage {
    
        @TargetAggregateIdentifier
        public final UUID carId;
    
        public final Garage garage;
    
        //... constructor omitted
    }
    

    我已经 read 要验证聚合的存在,最好在命令中使用加载的聚合,因为这已经意味着它的存在(而不是传递 garageId

    Car 使用 Axon's fixtures Garage new Garage(buildGarageCmd) . 它会说:

    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 到命令处理程序,这是聚合本身,也是不鼓励的。目前,我还没有找到一个正确的方法来做这件事,而且我还没有找到一个测试它的方法。

    2 回复  |  直到 4 年前
        1
  •  1
  •   Steven    6 年前

    AggregateFixtures 在Axon中,测试单个聚合,而不是聚合之间操作的协调。

    ParkCarInGarageCommand 失败是因为 Garage Car

        2
  •  2
  •   plalx    6 年前

    我不会在命令中放置AR实例。命令模式应该是稳定的,并且易于序列化/重新序列化,因为它们是消息契约。

    相反,您可以做的是解析命令处理程序中的依赖项。

    //ParkInGarage command handler
    Garage garage = garageRepository.garageOfId(command.garageId);
    Car car = carRepository.carOfId(command.carId);
    
    car.parkIn(garage);
    

    我根本不知道轴突框架,但现在应该比较容易测试。