2017-09-28 7 views
1

特定のエキストラがインテントに追加されていることを確認しようとしていますが、ユニットインテントのインテントのAndroidでnullを取得するたびに発生します。私は、テストする必要があり、次のクラスがあります。単体テストのインテントエキストラAndroid Mockito

public class TestClass extends SomeNotifier { 
     private Intent mIntent = new Intent("testintent"); 

     public TestClassConstructor(Context context) { 
      super(context); 
     } 

     @Override 
     public void notifyChange() { 
      mIntent.putExtra("Key one", 22); 
      mIntent.putExtra("Key two", 23); 
      mIntent.putExtra("Key three", 24); 
      getContext().sendBroadcast(mIntent); 
     } 
    } 

を、テストは次のとおりです(私もmockIntentてみましたが、結果は同じであり、再びエキストラがnull):

@RunWith(MockitoJUnitRunner.class) 
public class TestClassTest { 

    @Mock 
    Context mMockContext; 

    @Test 
    public void sendBroadcastTest() { 

    ArgumentCaptor<Intent> argument = ArgumentCaptor.forClass(Intent.class); 

    TestClass testClassNotifier = new TestClass (mMockContext); 
    testClassNotifier.notifyChange(); 
    verify(mMockContext).sendBroadcast(argument.capture()); 


Intent intent = argument.getValue(); 
//THE INTENT IS NULL 
Assert.assertTrue(intent.hasExtra("Key one")); 

    } 
} 

このテストを動作させるにはどうすればよいですか? 事前

答えて

0

Intentに感謝してContextのような他のAndroidランタイムクラスは、物理的なAndroidの携帯電話やエミュレータ上で、デフォルトでは、のみ使用可能です。ローカルユニットテストでは、スタブアウトされたランタイムバージョンが提供されており、Intentメソッドはデフォルトでnullを返します。説明はthis questionを参照してください。

これは、スタブアウトされたバージョンIntentに対して現在のテストが検証されており、デフォルトですべてのメソッド呼び出しに対してnullが返されることを意味します。

これを回避する方法がいくつかあります。実際のハンドセットやエミュレータで実行する必要があることを意味するインストルメントユニットテストにテストを変換することができます。また、Intentクラスを制御するクラスでラップすることもできます。

恐らく最も良い解決策は、Robolectricのようなフレームワークを使用することです。これは、あなたのIDEで実行されるローカルユニットテスト用のIntentのような重要なAndroidクラスの実際のテストダブル(シャドウと呼ばれる)を提供します。

あなたは単にあなたのテスト作業をするために、以下を追加しますRobolectricを慎重にインストールした後:

:さておき、あなたは、Android上でMockitoの正しい依存関係を使用していることを確認してくださいとして

@RunWith(RobolectricTestrunner.class) 
public class TestClassTest { 

testCompile 'org.mockito:mockito-core:2.8.9' 
androidTestCompile 'org.mockito:mockito-android:2.8.9'