2016-11-29 7 views
2

メソッド呼び出しを行い、レスポンスからリスナーを待つクラスをテストしようとしています。Mockitoのモックコールバックとリスナー

これらはインタラクタ内のインターフェイスです。 fetchに電話すると、リスナー機能の1つがコールバックされます。

interface Interactor { 
    void fetch(int offset, int size); 
} 

interface InteractorListener { 
    void onReady(List<Result> results); 

    void onError(); 
} 

public class MyInteractor implements Interactor{ 

    private ImageInteractorListener listener; 

    public MyInteractor() {} 

    public onAttach(ImageInteractorListener listener) { 
     this.listener = listener; 
    } 

    public void fetch(int offset, int size) { 
     // Make asyncrhonous task 
     // and manage the response in the next method 
    } 

    public void onAsyncroouTaskResponse() { 
     if (someChecks) { 
      listener.onReady(List<Result> results); 
     } else { 
      listener.onError(); 
     } 
    } 
} 

public class MyClass implements ImageInteractorListener { 

    public MyClass() { 
     MyInteractor interactor = new Interactor(); 
     interactor.onAttach(this); 
     interactor.fetch(1,1); 
    } 

    @Override 
    void onReady(List<Result> results) { 
     // doThings 
    } 

    @override 
    void onError() { 
     // doThings 
    } 
} 

これは私のクラスが作成された方法です。私はMyClassをテストする必要がありますので、私はInteractorコールバックを模擬する必要があります

私はさまざまな問題で別の解決策を試しましたので、今は最終的なコードやエラーがありません。しかし、誰も作品..

ありがとう。

+0

クラス階層がわかりません。あなたは 'Interactor'で' fetch'を呼び出す "クラス"を持っています。この 'Interactor'は型が' InteractorListener'のメンバを持っていて、フェッチが呼ばれた後に 'onReady'か' onError'が呼び出されたことを確認したいのですか? –

+0

サンプルコードを追加しました。ありがとうございました! – adalPaRi

答えて

1

あなたは単に手動でコールバックを呼び出すことができますMyClassをテスト

// Test that errors are handled 

// Given 
Interactor interactor = mock(Interactor.class); 
MyClass myClass = new MyClass(interactor); 

// When 
interactor.fetch(0, 0); // this call is optional, I just added it for clarity 
myClass.onError(); 

// Then 
// verify something 
+0

正確には、 'MyClass'がテストされているクラスであれば、それを模倣してはいけません。そうでなければテストは意味をなさないでしょう。 –

+0

しかしあなたの例では、テスト中のMyClassを嘲笑しています – adalPaRi

+3

私の例では、私は 'Interactor'だけを嘲笑しています。 「MyClass」は嘲笑されません。 –

1

のDimitryのアプローチは良いですが、私は個人的にあなたのonAsyncroouTaskResponse()公開されて、私はそれを呼び出すと思いますから、フェッチ呼び出しではないだろうとしていると仮定すると、 verify(yourmock).onError()または同様のものが呼び出されたことを確認してください。

私が時々作るもう1つのアプローチは、特定のメソッドをオーバーライドして呼び出された回数などのカウントを保持する「TestableSubject」を作成することです(class extends YourOriginalClass)。時には、クラスの性質上、それらをすべて模倣することはできません(最終的なもの、抽象的なもの、私的なものなど)。

非同期タスクの完了時にコールバックが(結果に関係なく)呼び出された場合、フェッチ・パートをスキップして、フェッチ・ファイアをテストできます別のテストの仕事ですが、私はここであなたが後の部分にもっと興味があると思います。