2013-07-20 35 views
0

我正在閱讀一些討論DomainEvent模式的文章。但我有一個問題如何編寫測試。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; 
    } 
} 

添加測試雙和disipline團隊不使用它在生產代碼的注射方法。但是這似乎是可測性的缺點。

回答

1

正如Udi的文章所述,您不需要注入接口的實現,因爲測試可以直接將所需的處理程序直接添加到發佈者。在您的測試設置方法中,添加適當的處理程序。作爲執行測試的一部分,您確保處理程序按預期運行。然後在測試中,你清除處理程序。

+0

+ 1感謝:

public void commitTo(Spring aSpring) { getDomainEventPublisher().publish(new BacklogItemCommitted(.......)) } protected DomainEventPublisher getDomainEventPublisher() { return DomainEventPublisher.intance(); } 
現在

在您的測試只是一個返回的模擬DomainEventPublisher覆蓋getDomainEventPublisher()方法您。我對.net知之甚少,並完全與測試代碼片段「p => P.Customer」或類似的東西混淆。它看起來像我需要一個Singleton引導一個ApplicationContext用於生產代碼中的依賴注入。 – Hippoom

1

中的所有問題都可以通過間接的另一層來解決:

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

+1,謝謝,這是另一個可行的理由。然後,Subclass重寫與遺留代碼的高效工作,但這些解決方案通常暗示代碼很難測試,因此引發了我的問題 – Hippoom

相關問題