0

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

例如:

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

我该如何测试它?模拟 DomainEventPublisher 很困难,因为它是一个单例。我在有效地使用遗留代码中找到了一个解决方案:

public class DomainEventPublisher {
    private DomainEventPublisher singleton;

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

为测试替身添加注入方法并约束团队不要在生产代码中使用它。但这似乎是可测试性的缺点。

4

2 回答 2

1

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

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

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

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

@Test
public foo() {
    // arrange
    DomainEventPublisher mockDomainEventPublisher = mock(DomainEventPublisher.class);
    MyObject testObject = new MyObject() { 
        @Override
        protected DomainEventPublisher getDomainEventPublisher() {
             return mockDomainEventPublisher;
        }
    }
    .....
}
于 2013-07-22T17:47:42.360 回答
1

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

于 2013-07-21T01:07:22.370 回答