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()では、あなたのモックを返すメソッドでメソッドをオーバーライドするだけです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 に答える