私は主催者の初期化中に他のプレゼンターが特定のメソッドを呼び出すことを確認するために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番目のコードをステップオーバーすると、うまく動作します。非常に奇妙なことがここで起こっています。問題を見つけるためにデバッグすることができないので、人生を非常に困難にしています。
あなたがテストしているコードに関係するスレッドはありますか?ブレークポイントを追加したときに「時には合格」という条件で、競合状態として聞こえるようになります。 – Augusto
@Augustoしかし、私は単体テストをインターリーブすることができますが、異なるオブジェクトを参照する必要があることを認識しています。私はチェックして、 'ChildPresenter'オブジェクトの他のインスタンスがないことを確認しました。それは、それが具象クラスに作られ、テストが実行されたときだけ呼び出されます。しかし、ブレークポイントを下げることは、これらが2つの異なるオブジェクトであることを示しています。だから、私はこのすべてでかなり混乱しています。 – Draken
@Augusto私はさらにチェックを行い、ブレークポイントがなくても常に第3子のプレゼンターに失敗することがわかりました。これは、他の場所で具体的なクラスに作られているものです。ただし、ブレークポイントを実行して各メソッドをステップ実行すると、正常に動作します。どのように私の子供のプレゼンターの具体的なバージョンは、テストに干渉する? – Draken