具有模拟依赖项的Android UI测试

时间:2019-04-02 13:07:12

标签: android mockito ui-testing android-instrumentation

我有一个提供按钮的活动。单击按钮将调用数据提供程序类中的方法,并根据该方法的返回值进行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
.
.
.

1 个答案:

答案 0 :(得分:0)

即使您可以模拟DataProvider,它也无济于事,因为您没有在测试期间将其实例注入MyClientActivity中。无法模拟DataProvider的原因未知,请提供此类。