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();
}
现在,在您的测试中,只需使用返回mockDomainEventPublisher
的方法覆盖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;
}
}
.....
}