2016-06-17 18 views
-3

私は主催者の初期化中に他のプレゼンターが特定のメソッドを呼び出すことを確認するためにMockitoでいくつかのテストを作成しました。他の発表者は嘲笑されています。ユニットテストはorg.mockito.exceptions.misusing.UnfinishedVerificationExceptionで失敗します

嘲笑のプレゼンターはすべて、次のインタフェースを実装しています。私は、次のしている私の親プレゼンタークラスで

public interface Presenter<V> { 

    V getView(); 

    void initPresenter(); 
} 

public class ParentPresenter() implements Presenter<ParentView>{ 
    private ParentView view; 

    private ChildPresenterOne childPresenterOne;  
    private ChildPresenterTwo childPresenterTwo;  
    private ChildPresenterThree childPresenterThree;  
    private ChildPresenterFour childPresenterFour; 

    @Inject 
    public ParentPresenter(ParentView view, ChildPresenterOne childPresenterOne, 
           ChildPresenterTwo childPresenterTwo, 
           ChildPresenterThree childPresenterThree 
           ChildPresenterFour childPresenterFour) { 
     this.view = view; 
     this.childPresenterOne= childPresenterOne; 
     this.childPresenterTwo= childPresenterTwo; 
     this.childPresenterThree= childPresenterThree; 
     this.childPresenterFour= childPresenterFour; 
    } 

    //Other code 

    @Override 
    public void initPresenter() { 
     view.setPresenter(this); 

     childPresenterOne.initPresenter(); 
     childPresenterTwo.initPresenter(); 
     childPresenterThree.initPresenter(); 
     childPresenterFour.initPresenter(); 

     childPresenterOne.setParentPresenter(this); 
     childPresenterTwo.setParentPresenter(this); 
     childPresenterThree.setParentPresenter(this); 
     childPresenterFour.setParentPresenter(this); 

     registerHandlers(); 
    } 
} 

public interface PresenterHasParent<V, P extends Presenter> extends Presenter<V> { 

    public abstract void setParentPresenter(P presenter); 
} 

そしてPresenterは次のセットアップを持っています

ご覧のとおり、Injectionを使用して簡単に単体テスト。私はそのようにように私の嘲笑のインスタンスを作成します。これらのテストを実行する際に

public class ParentPresenterTest { 
    private List<PresenterHasParent> presenters; 
    private ChildPresenterOne childPresenterOne;  
    private ChildPresenterTwo childPresenterTwo;  
    private ChildPresenterThree childPresenterThree;  
    private ChildPresenterFour childPresenterFour; 
    private ParentPresenter parentPresenter; 
    private View view; 

    @BeforeTest 
    public void setUp() { 
     presenters = new ArrayList<PresenterHasParent>(); 
     view = mock(View.class);   

     childPresenterOne= mock(ChildPresenterOne.class); 
     presenters.add(childPresenterOne); 

     childPresenterTwo= mock(ChildPresenterTwo.class); 
     presenters.add(childPresenterTwo); 

     childPresenterThree= mock(ChildPresenterThree.class); 
     presenters.add(childPresenterThree); 

     childPresenterFour= mock(ChildPresenterFour.class); 
     presenters.add(childPresenterFour); 

     parentPresenter = new ParentPresenter(view, childPresenterOne, childPresenterTwo, childPresenterThree, childPresenterFour); 
    } 

    @Test 
    public void testInitPresenter() { 
     parentPresenter.initPresenter(); 
     verify(view).setPresenter(parentPresenter); 
     for(PresenterHasParent presenterToCheck : presenters) { 

      Reporter.log("Testing the presenter " + presenterToCheck.getClass().getName(), true); 

      verify(presenterToCheck).initPresenter(); 
      verify(presenterToCheck).setParentPresenter(parentPresenter); 

      validateMockitoUsage(); 

      Reporter.log("Successfully tested the presenter " + presenterToCheck.getClass().getName(), true); 
     } 
    } 
} 

、私は(私は何をすべきかに応じて)、第三または第四プレゼンターの障害を取得している:

org.mockito .exceptions.misusing.UnfinishedVerificationException:ここで確認のために 欠落メソッド呼び出し(偽): - 正しい検証> ParentPresenterTest.testInitPresenter(ParentPresenterTest.java:118)で

例: (モック).doSomethingを(ベリファイ)

また、 final/private/equals()/ hashCode()メソッドのいずれかを検証するため、このエラーが表示されることがあります。これらの方法はできません stubbed /検証。それは一貫して失敗した場合 ParentPresenterTest.testInitPresenter(ParentPresenterTest.java:119)

は今、私は理解できたが、私は、各メソッドを介してでブレークポイントを入れて、ステップた場合、それが正常に動作します。ブレークポイントを置かないと、常に失敗し、3番目のプレゼンターに表示される行(118)について文句を言います。verify(presenterToCheck).setParentPresenter(presenter);

私はデバッグしてステップオーバーすると動作しないコード。この困惑している問題に誰かが光を当てることはできますか?

編集

私がチェックし、再度コードを実行して確認する第三プレゼンターをステップオーバーのであれば、それは同じ問題を持つ第四いずれかに失敗します。しかし、私も4番目のコードをステップオーバーすると、うまく動作します。非常に奇妙なことがここで起こっています。問題を見つけるためにデバッグすることができないので、人生を非常に困難にしています。

+0

あなたがテストしているコードに関係するスレッドはありますか?ブレークポイントを追加したときに「時には合格」という条件で、競合状態として聞こえるようになります。 – Augusto

+0

@Augustoしかし、私は単体テストをインターリーブすることができますが、異なるオブジェクトを参照する必要があることを認識しています。私はチェックして、 'ChildPresenter'オブジェクトの他のインスタンスがないことを確認しました。それは、それが具象クラスに作られ、テストが実行されたときだけ呼び出されます。しかし、ブレークポイントを下げることは、これらが2つの異なるオブジェクトであることを示しています。だから、私はこのすべてでかなり混乱しています。 – Draken

+0

@Augusto私はさらにチェックを行い、ブレークポイントがなくても常に第3子のプレゼンターに失敗することがわかりました。これは、他の場所で具体的なクラスに作られているものです。ただし、ブレークポイントを実行して各メソッドをステップ実行すると、正常に動作します。どのように私の子供のプレゼンターの具体的なバージョンは、テストに干渉する? – Draken

答えて

0

少し調べたところ、問題が見つかりました。新しい抽象クラスを作成する前に、私はMockitoを混乱させていました。それは少し悪いデザインだったが、奇妙な動作をしているMockito。

私がチェックしていた方法:

verify(presenterToCheck).setParentPresenter(parentPresenter); 

は、インタフェースPresenterHasParentで抽象メソッドました。しかし、テストに失敗したオブジェクトもBaseEditPresenterを実装しました。このBaseEditPresenterはインターフェイスPresenterHasParentを実装していませんが、メソッドsetParentPresenter()の独自のバージョンを持っていました。これは、どのメソッドが本当に呼び出されたのかわからないので(たとえ同じことをしたとしても)、Mockitoとの混乱を引き起こしていました。それはステップオーバーで動作したが、コードが直接実行されたときは決して奇妙であった。だから、それを修正するために

は、私がデザインをクリーンアップし、BaseEditPresenterPresenterHasParentインタフェースを実装していたし、それがChildPresenterThreeChildPresenterFourのサブクラスだではないことを確認しました。

関連する問題