使用模拟依赖项进行 Android UI 测试



我有一个活动,我在其中提供了一个按钮。单击该按钮将调用数据提供程序类中的方法,并根据该方法的返回值进行 UI 更改。现在,我想编写一个插click()测试,在按钮中执行,但避免在数据提供程序类中实际调用该方法。相反,我想从方法返回所需的值,然后检查 UI 是否进行了相应的修改。

我的活动

@Override
public void onCreate(final Bundle savedInstanceState) {
mActionButton.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(final View v) {
boolean result = dataProvider.getResult();
if(result) {
mSuccessTextView.setVisibility(View.VISIBLE);
}
}
});
}

在这里,单击按钮时,将调用DataProvider#getResult,并且此方法的结果存储在result中。如果结果true以前GONE的文本视图mSuccessTextView现在将变为VISIBLE
这里的问题是DataProvider#getResult处理许多外部组件,这使得测试变得不可能。所以我想做的是使用DataProvider的模拟实例,以便我可以让getResult返回所需的值,然后检查mSuccessTextView的可见性。这是我尝试过的:

我的活动测试.java

@RunWith(AndroidJUnit4.class)
public class MyActivityTest {
private DataProvider mDataProvider;
@Rule
public IntentsTestRule<MyActivity> mIntentRule =
new IntentsTestRule<>(MyClientActivity.class);
@Before
public void setUp() {
mDataProvider = mock(DataProvider.class);
}
@Test
public void testResultSuccess() {
boolean result = true;
when(mDataProvider.getResult()).thenReturn(result);
onView(withId(R.id.action_button)).perform(click());
onView(withId(R.id.success_text_view)).check((ViewAssertion) isDisplayed());
}
}

执行上述操作会生成以下错误:

org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class com.domain.myapp.DataProvider.
Mockito can only mock non-private & non-final classes.
If you're not sure why you're getting this error, please report to the mailing list.
Underlying exception : java.lang.UnsupportedOperationException: Cannot define class using reflection
.
.
.
Caused by: java.lang.UnsupportedOperationException: Cannot define class using reflection
.
.
.
Caused by: java.lang.IllegalStateException: This JVM's version string does not seem to be valid: 0
.
.
.

即使你可以模拟DataProvider,它也不会帮助你,因为你在测试期间没有将其实例注入MyClientActivity。无法模拟DataProvider的原因尚不清楚,请提供课程。

相关内容

  • 没有找到相关文章

最新更新