2016-11-17 10 views
0

私は、ビューを返す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の実装であり、コードがスムーズ。

ヒント

+0

Presenterで、Viewをコンストラクタパラメータとして使用しています。しかし、MyViewの定義はViewから拡張されないので、コンパイルされません(Viewインスタンスに対してthis.viewを設定できません)。これはコードの入力ミスですか? – mdewit

+0

PresenterのコンストラクタでMyViewをMyViewに変更すると、テストケースがコンパイルされて正常に実行されます – mdewit

答えて

0

テスト済みのクラスがMyViewの代わりにビュー(表示/定義されていない)を取得していることが既に確認されています。

問題がある場合は、以下のコードを見て比較することができます。

public class SomeTest { 
    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() { 
    assertTrue(presenter.isViewActive()); 
    verify(mockView).isActive(); 
    } 

    private class Presenter { 
    private MyView view; 

    public Presenter(MyView view) { 
     this.view = view; 
    } 

    public boolean isViewActive() { 
     return getView().isActive(); 
     //return true; 
    } 

    public MyView getView() { 
     return view; 
    } 
    } 

    private interface MyView { 
    boolean isActive(); 
    } 
} 
+0

申し訳ありませんが、最近まで回答がわかりませんでした。 したがって、具体的なクラスではないので、インターフェースMyViewをモックすると、Mockitoは具体的なクラスであるスーパークラスをモックしようとしていると推測していますか?つまり、インタフェースを模擬することはできません。 – Derekyy

+0

いいえ、間違いなく。実際にはインターフェイスを模擬するのが良い方法ですが、上のコードで貼り付けたものです。 (MyViewはインターフェイスであり、嘲笑されている)。あなたのコードの唯一の問題は、 'View'という別のクラスを使用していることです( 'Presenter'のコンストラクタパラメータを参照)。 –

+0

私は気づいた。申し訳ありませんが、それは単にタイプミスでした。実際のケースでは、Presenterコンストラクタのビューは実際はMyViewのインスタンスです。あなたの答えは正しいわけではありません – Derekyy

関連する問題