2017-09-28 59 views
1

我想驗證特定的演員是否添加到意圖,但所有的時間,我在單元測試Android意圖爲空。我有以下的類需要被測試:單元測試中的意圖演示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和其他Android運行時類(如Context)默認情況下僅在物理Android手機和仿真器上可用。對於本地單元測試,您將獲得運行時的殘缺版本,默認情況下,Intent等方法將返回null。有關說明,請參閱this question

這意味着您當前的測試正在針對Intent的殘缺版本進行驗證,默認情況下將針對所有方法調用返回null

有一些解決方法 - 您可以將測試轉換爲儀器化的單元測試,這意味着您必須在真正的手機或模擬器上運行測試。或者,您可以用您控制的類包裝Intent類。

也許最好的解決方案是使用像Robolectric這樣的框架。這將爲您提供在您的IDE中運行的本地單元測試的重要Android類(如Intent)的工作測試雙打(稱爲陰影)。

一旦你仔細安裝Robolectric則只需添加以下,使您的測試工作:

@RunWith(RobolectricTestrunner.class) 
public class TestClassTest { 

順便說一句,請確保您使用的是Android上進行的Mockito正確的依賴關係:

testCompile 'org.mockito:mockito-core:2.8.9' 
androidTestCompile 'org.mockito:mockito-android:2.8.9' 
相關問題