3

Mockitoを使用してテストボタン機能を試してみました。コードには、Layout/SampleActivity/UnitTest の主要なコンテンツが含まれます。

レイアウト ファイルの定義:

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;
}

UnitTest ファイルの定義

@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 が出力されます。なぜですか? 修正方法は?</li>
4

1 に答える 1

0

それはとても簡単に説明できます。

XML 属性は、リフレクションを介してメソッドを呼び出すために使用されます ( Android Xml 属性 android:onClick="..." は舞台裏でどのように機能しますか? )。

したがって、単純化すると、ボタンからのコンテキストが使用され、リフレクションによってメソッドが呼び出されます。ボタンはインフレーション中にコンテキストを取得し、スパイ活動ではないことを示します。そのため、実際のメソッドがテストで呼び出されます。

スパイ活動への参照を介してメソッドを呼び出すと、機能します。

直し方:

  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();
}
于 2016-05-13T12:52:33.333 に答える