2011-08-22 4 views
11

もっと完全な質問は、コールバックをパラメータとする依存関係がある場合、コールバックロジックをカバーする単体テストを書くにはどうすればよいですか?は依然として依存関係をモックアップしていますか?上記の例でユニットテストコールバックロジックはどうですか?

public class DoStuff { 
    public void runThis(Runnable callback) { 
     // call callback 
    } 
} 

public class ClassUnderTest { 
    private DoStuff stuffToDo; 

    public void methodUnderTest() { 
     this.stuffToDo.runThis(/*a runnable with some logic*/) 
    } 
} 

Iを呼び出し、メソッド呼び出しの模擬出力を検証する必要があるため、私はstuffToDoをモックであろう。ただし、runThisを欺くと、コールバックロジックがテストされません。さらに、コールバックロジックは私的でなければならないようですので、直接テストすることは期待しません。おそらくそれは私の誤解です。

コールバックはかなり広範に使用されているので、私はそれらをテストするための一般的な方法があると思いますが、見つけられませんでした。

+0

コールバックはこのコンテキストでのみテストする必要がありますか?もしそうなら、結果を期待している、渡す予定のさまざまなコールバックのテストを書いてみませんか?何か不足していますか? – Jonah

+0

この例のようにCountDownLatchを試したことがありますか?http://stackoverflow.com/a/3802487/2301224 – Baker

答えて

10

単一のテストではできません。あなたが何かを模倣した場合、を嘲笑します。つまり、引数を検証し、戻り値(テストで設定する)をシミュレートするだけです。

実際、何かを模擬することの全ポイントは、偽を単独で使用するものをテストすることです。単体テストをDoStuffにしたい場合は、動作しているかどうかにかかわらず、いくつかのコールバック実装を心配する必要はありません。あなたはそれを心配する必要がないようにコールバックを嘲笑します。

コールバックコードを孤立してテストすることで、コールバックユーザーを単独で(コールバック用のモックを使用して)テストし、おそらく適切な測定のために統合テストを投げて、テストすることができます()完全に構成されたコンポーネント全体。

1

基本的には、クラスDoStuffをテストします。つまり、DoStuff内のすべてのメソッドをテストする必要があります。この場合、あなたがする必要があるのは、stuffToDoそのものを嘲笑するのではなく、をstuffToDoに注入してください。実行ファイルが正常に実行されたかどうかを確認します。

しかし、クラス内に他の機能がある場合は、テストを別にしてモックアウトすることができます。

+1

DoStuffを依存関係とするClassUnderTestをテストしたいと思います。 –

0

具体的には、すでにDoStuffをテストしたことがあります(または侮られていないので気にしません)。あなたが設計した特定のRunnableをユニットテストしているようです。この場合、callbackは、誰かがデータベース戦略またはメモリ内戦略を直接的にユニットテストするのと同じ方法で、テストしたいものとまったく同じように聞こえます。

これが試行している場合は、可能であればできるだけ早くClassUnderTestを実行して、ブラックボックスでテストできます。または、特定のRunnableでテストハーネスを作成することもできます。このコードを公開していて、テストハーネスを到達可能にしたくない場合は、テストハーネスメソッドをプライベートにし、詳細をユニットテストアセンブリと共有することができます。

友だちアセンブリの作成方法については、hereを参照してください。私は通常、ユニットテストコードに署名し、コマンドラインコンパイラに悩まされる必要はありません。私はそれがあなたのビルド環境に依存すると思います。

+0

いいえ、ClassUnderTestはテストするクラスです。私はDoStuffを嘲笑している。 –

+0

これを反映するようにクラス名を変更しました。それは答えに影響しません。 –

0

EasyMockを使用している場合は、andStubAnswerを使用して実行可能ファイルを呼び出すことができます。

doSomethingMock.runThis(runnable); 
expectLastCall().andStubAnswer(new IAnserable<Void>() { 
    Runnable runnable = (Runnable)getCurrentArguments()[0]; 
    runnable.run(); 
    return null; 
}); 

他のモッキングフレームワークにも同様のものが含まれていると思います。

0

Runnableを無条件に呼び出す偽のDoStuffはどうですか?

次に、コールバックが実行された場合に観察されるべき変更の影響を理解するだけです。

関連する問題