Domain driven design 为什么DomainEvent不损害可测试性?

Domain driven design 为什么DomainEvent不损害可测试性?,domain-driven-design,Domain Driven Design,我正在读一些讨论模式的文章。但是我有一个问题,如何用它编写测试 例如: public void commitTo(Spring aSpring) { ... DomainEventPublisher.intance().publish(new BacklogItemCommitted(.......)) } 如何测试它?很难模仿DomainEventPublisher,因为它是单例的。我在以下方面找到了解决方案: 为testdouble添加一个注入方法,并禁止团队在生产代码中使

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

例如:

public void commitTo(Spring aSpring) {
    ...
    DomainEventPublisher.intance().publish(new BacklogItemCommitted(.......))
}
如何测试它?很难模仿DomainEventPublisher,因为它是单例的。我在以下方面找到了解决方案:


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

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

其中的所有问题都可以通过另一层间接寻址来解决:

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

protected DomainEventPublisher getDomainEventPublisher() {
    return DomainEventPublisher.intance();
}
现在,在您的测试中,只需使用返回mock
DomainEventPublisher
的方法覆盖
getDomainEventPublisher()
方法:

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

+谢谢你。我对.net知之甚少,对测试代码片段“p=>p.Customer”之类的东西完全感到困惑。看起来我需要一个单例来引导ApplicationContext,以便在生产代码中注入依赖项。+1,谢谢,这是另一个可行的解决方案。子类在有效地处理遗留代码时会重写,但这些解决方案通常会提示代码很难测试,因此提出了我的问题
@Test
public foo() {
    // arrange
    DomainEventPublisher mockDomainEventPublisher = mock(DomainEventPublisher.class);
    MyObject testObject = new MyObject() { 
        @Override
        protected DomainEventPublisher getDomainEventPublisher() {
             return mockDomainEventPublisher;
        }
    }
    .....
}