我正在阅读一些讨论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添加一个注入方法,并禁止团队在生产代码中使用它。但这似乎是可测性的缺点。
答案 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;
}
}
.....
}