为什么DomainEvent不会损害可测试性?

时间:2013-07-20 05:43:50

标签: domain-driven-design

我正在阅读一些讨论DomainEvent模式的文章。但我有一个问题,如何用它来编写测试。

例如:

public void commitTo(Spring aSpring) {
    ...
    DomainEventPublisher.intance().publish(new BacklogItemCommitted(.......))
}

我该如何测试?模拟DomainEventPublisher非常困难,因为它是一个单例。我在Working effectively with legacy code找到了一个解决方案:

public class DomainEventPublisher {
    private DomainEventPublisher singleton;

    public void setSingleton(DomainEventPublisher singleton) {
        this.singleton = singleton;
    }
}

为test double添加一个注入方法,并禁止团队在生产代码中使用它。但这似乎是可测性的缺点。

2 个答案:

答案 0 :(得分:1)

正如Udi的文章中所指出的,您不需要注入接口的实现,因为测试可以直接向发布者添加所需的处理程序。在测试设置方法中,添加适当的处理程序。作为执行测试的一部分,您可以确保处理程序按预期运行。然后在测试中拆除,清除处理程序。

答案 1 :(得分:1)

IT中的所有问题都可以通过另一层间接解决:

public void commitTo(Spring aSpring) {
    getDomainEventPublisher().publish(new BacklogItemCommitted(.......))
}

protected DomainEventPublisher getDomainEventPublisher() {
    return DomainEventPublisher.intance();
}

现在在您的测试中,只需使用返回模拟getDomainEventPublisher()的方法覆盖DomainEventPublisher方法:

@Test
public foo() {
    // arrange
    DomainEventPublisher mockDomainEventPublisher = mock(DomainEventPublisher.class);
    MyObject testObject = new MyObject() { 
        @Override
        protected DomainEventPublisher getDomainEventPublisher() {
             return mockDomainEventPublisher;
        }
    }
    .....
}