我有一个活动,我在其中提供了一个按钮。单击该按钮将调用数据提供程序类中的方法,并根据该方法的返回值进行 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
的原因尚不清楚,请提供课程。