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="..." 如何在幕后工作?)。

因此,通过一些简化,将使用来自按钮的上下文,并通过反射调用方法。Button 在通货膨胀期间获取上下文,它是对非间谍活动的引用。这就是为什么在您的测试中调用真正的方法。

当您通过对间谍活动的引用调用该方法时,它会起作用。

怎么修:

  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 回答