私は、ビューを返すgetView()メソッドを持つプレゼンターを持っています。 MyView(インターフェイス)を実装するビューには、アクティブであるかどうかを示すisActiveメソッドがあります。単体テスト - Mockitoはインタフェースを模擬したときにNullPointerExceptionを返します
私はプレゼンターをテストしています。
testClassの@Beforeセットアップでは、プレゼンターを初期化します。
testClass.java:
@RunWith(AndroidJUnit4.class)
public class testClass {
private Presenter presenter;
@Mock
private MyView mockView;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
presenter = new Presenter(mockView);
when(mockView.isActive()).thenReturn(true);
}
@Test
public void testIsActive() {
presenter.isViewActive();
verify(mockView).isActive();
}
Presenter.java:
public class Presenter {
private MyView view;
// The following view is an instance of MyView, not View (typo before).
public Presenter(MyView view) {
this.view = view;
}
public boolean isViewActive() {
return getView().isActive();
}
public MyView getView() {
return view;
}
}
MyView.class:とき
presenter.isViewActive();
public interface MyView {
boolean isActive();
}
しかしながら、上記のコードは、NullPointerExceptionが生成します
が実行されています。
なぜですか?
私は
@Mock
private ConcreteMyView mockView;
と
@Mock
private MyView mockView;
を交換するときConcreteMyViewインターフェイスMYVIEWの実装であり、コードがスムーズ。
ヒント
Presenterで、Viewをコンストラクタパラメータとして使用しています。しかし、MyViewの定義はViewから拡張されないので、コンパイルされません(Viewインスタンスに対してthis.viewを設定できません)。これはコードの入力ミスですか? – mdewit
PresenterのコンストラクタでMyViewをMyViewに変更すると、テストケースがコンパイルされて正常に実行されます – mdewit