我有一个提供按钮的活动。单击按钮将调用数据提供程序类中的方法,并根据该方法的返回值进行UI更改。现在,我想编写一个仪器化测试,在该按钮中执行click()
,但避免实际在数据提供程序类中调用该方法。相反,我想从方法中返回所需的值,然后检查UI是否已相应修改。
MyActivity
@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
,则现在将文本视图mSuccessTextView
(以前是GONE
)制成VISIBLE
。
这里的问题是DataProvider#getResult
处理了很多外部组件,这些组件使测试变得不可能。所以我想做的是使用DataProvider
的模拟实例,以便我可以让getResult
返回所需的值,然后检查mSuccessTextView
的可见性。 这是我尝试过的:
MyActivityTest.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
.
.
.
答案 0 :(得分:0)
即使您可以模拟DataProvider
,它也无济于事,因为您没有在测试期间将其实例注入MyClientActivity
中。无法模拟DataProvider
的原因未知,请提供此类。