3

我已經嘗試使用Mockito的測試按鈕功能。該代碼包括佈局/ SampleActivity /單元測試的主要內容:btn.performClick()無法模擬對象,但活動調用函數是能

佈局文件定義:

android:text="testbtnmock" 
android:id="@+id/btn_testbtnmock" 
android:onClick="testBtnMock" 

SampleActivity文件中定義

public void testBtnMock(View view) { 
    System.out.println("value:"+getInt()); 
} 

public int getInt(){ 
    return 0; 
} 

單元測試文件中定義

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class SampleActivityTest { 
    private SampleActivity sampleActivity; 
    private Button testBtnMock; 
    @Before 
    public void setUp() { 
    ShadowLog.stream = System.out; 
    } 
    @Test 
    public void testBtnMock() { 
    sampleActivity = Robolectric.setupActivity(SampleActivity.class); 
    SampleActivity spySampleActivity = spy(sampleActivity); 
    when(spySampleActivity.getInt()).thenReturn(100); 
    //spySampleActivity.testBtnMock(mock(View.class)); //it is working , print 100 
    testBtnMock = (Button) sampleActivity.findViewById(R.id.btn_testbtnmock); 
    testBtnMock.performClick(); //it is not work , print 0 ,mock invalid 
    } 
} 

我的問題是:

  1. 爲什麼使用spySampleActivity.testBtnMock(mock(View.class));觸發的testBtnMock(View v)功能。它正在工作並打印100.
  2. 但使用testBtnMock.performClick();不起作用並打印0.爲什麼?如何解決它?

回答

0

這很容易解釋。

XML屬性將用於通過反射調用方法(How does the android Xml attribute android:onClick="..." work behind the scenes?)。

因此,通過一些簡化,將使用按鈕的上下文並通過反射調用方法。按鈕在通貨膨脹期間獲取上下文,並且它是對非間諜活動的參考。這就是爲什麼在你的測試中調用真正的方法。

當您通過對間諜活動的引用調用該方法時,它可以工作。

如何解決:

  1. 提取的一類,它負責提供整數
  2. 模擬它,並在測試注入

喜歡的東西:

public class IntegerProvider { 
    public int getInt(){ 
    return 0; 
    } 
} 

public class SampleActivity { 
    IntegerProvider intProvider; 

    public void testBtnMock(View view) { 
    System.out.println("value:" + intProvider.getInt()); 
    } 
} 

@Test 
public void testBtnMock() { 
    sampleActivity = Robolectric.setupActivity(SampleActivity.class); 
    IntegerProvider providerMock = mock(IntegerProvider.class); 
    when(providerMock.getInt()).thenReturn(100); 
    sampleActivity.intProvider = providerMock; 

    testBtnMock = (Button) sampleActivity.findViewById(R.id.btn_testbtnmock); 
    testBtnMock.performClick(); 
} 
相關問題