在活动点击操作导航到另一个活动上运行浓缩咖啡测试

时间:2018-07-27 06:10:27

标签: android android-espresso

我正在尝试对MainActivity上的点击操作进行意式浓缩咖啡测试,这会将我带到DetailActivityView,并使用从先前视图中调用的数据库({{ 1}})。不幸的是,我无法正确连接试图在第二个活动(MainActivty)加载所需数据时用来监视的IdlingResource

这是我设置意式浓缩咖啡的方式:

MainActivity类:

DetailActivity

ViewIdlingResource类:

@VisibleForTesting
public QuizIdlingResource quizIdlingResource;

@VisibleForTesting
private ViewVisibilityIdlingResource viewVisibilityIdlingResource;

@Override
protected void onCreate(Bundle savedInstanceState) {
     // Codes

}

@Override
public void onListItemClick(int clickedItemIndex) {

    View view = findViewById(R.id.detail_container_view);

    viewVisibilityIdlingResource = new ViewVisibilityIdlingResource(view, 1);



    String name = null;
    String classification = null;
    String scientificName = null;
    String imageAsset = null;
    int dangerLevel = 0;

    Cursor cursor = mDbManager.queryInsectsById(clickedItemIndex);

    if (cursor != null && cursor.moveToFirst()) {
        cursor.moveToFirst();
        name = cursor.getString(cursor.getColumnIndex("name"));
        classification = cursor.getString(cursor.getColumnIndex("classification"));
        scientificName = cursor.getString(cursor.getColumnIndex("scientificName"));
        imageAsset = cursor.getString(cursor.getColumnIndex("imageAsset"));
        dangerLevel = cursor.getInt(cursor.getColumnIndex("dangerLevel"));

    }

    // Prepare the the data for the bug details view
    Intent intent = new Intent(MainActivity.this, InsectDetailsActivity.class);
    intent.putExtra("name", name);
    intent.putExtra("classification", classification);
    intent.putExtra("scientificName", scientificName);
    intent.putExtra("imageAsset", imageAsset);
    intent.putExtra("dangerLevel", dangerLevel);
    startActivity(intent);




}

// More code


@VisibleForTesting
public IdlingResource getIdlingResource() {
    if (viewVisibilityIdlingResource != null) {
        viewVisibilityIdlingResource.isIdleNow();
    }
    return viewVisibilityIdlingResource;
}

我的测试班:

import android.support.test.espresso.IdlingResource;
import android.view.View;

public class ViewVisibilityIdlingResource implements IdlingResource {

private final View mView;
private final int mExpectedVisibility;

private boolean mIdle;
private IdlingResource.ResourceCallback mResourceCallback;

public ViewVisibilityIdlingResource(final View view, int expectedVisibility) {
    this.mView = view;
    this.mExpectedVisibility = expectedVisibility;
    this.mIdle = false;
    this.mResourceCallback = null;
}

@Override
public final String getName() {
    return ViewVisibilityIdlingResource.class.getSimpleName();
}

@Override
public final boolean isIdleNow() {
    mIdle = mIdle || mView.getVisibility() == mExpectedVisibility;

    if (mIdle && mResourceCallback != null) {
        mResourceCallback.onTransitionToIdle();
    }

    return mIdle;
}

@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
    mResourceCallback = resourceCallback;
}
}

运行测试时出现错误:

  

java.lang.NullPointerException:尝试在空对象引用上调用接口方法'java.lang.String android.support.test.espresso.IdlingResource.getName()'       在android.support.test.espresso.base.IdlingResourceRegistry.sync(IdlingResourceRegistry.java:104)       在android.support.test.espresso.base.BaseLayerModule.provideDynamicNotifer(BaseLayerModule.java:103)       在android.support.test.espresso.base.BaseLayerModule_ProvideDynamicNotiferFactory.proxyProvideDynamicNotifer(BaseLayerModule_ProvideDynamicNotiferFactory.java:34)       在android.support.test.espresso.base.BaseLayerModule_ProvideDynamicNotiferFactory.get(BaseLayerModule_ProvideDynamicNotiferFactory.java:23)       在android.support.test.espresso.base.BaseLayerModule_ProvideDynamicNotiferFactory.get(BaseLayerModule_ProvideDynamicNotiferFactory.java:8)       在android.support.test.espresso.base.UiControllerImpl.loopMainThreadUntilIdle(UiControllerImpl.java:341)       在android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:217)       在android.support.test.espresso.ViewInteraction.access $ 100(ViewInteraction.java:63)       在android.support.test.espresso.ViewInteraction $ 1.call(ViewInteraction.java:153)       在android.support.test.espresso.ViewInteraction $ 1.call(ViewInteraction.java:150)       在java.util.concurrent.FutureTask.run(FutureTask.java:237)       在android.os.Handler.handleCallback(Handler.java:739)       在android.os.Handler.dispatchMessage(Handler.java:95)       在android.os.Looper.loop(Looper.java:135)       在android.app.ActivityThread.main(ActivityThread.java:5254)       在java.lang.reflect.Method.invoke(本机方法)       在java.lang.reflect.Method.invoke(Method.java:372)       在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:903)       在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

很显然,@Rule public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class); private IdlingResource mIdlingResource; private IdlingRegistry idlingRegistry = IdlingRegistry.getInstance(); @Before public void registerIdlingResource() { mIdlingResource = mActivityTestRule.getActivity().getIdlingResource(); idlingRegistry.register(mIdlingResource); } @Test public void bug2ActivityTest() {// Test code } @After public void unregisterIdlingResource() { if (mIdlingResource != null) { idlingRegistry.unregister(mIdlingResource); } } 状态是由于来自null的呼叫而导致的,而点击某个项目后不再出现MainActivity会导致导航。我认为这应该放在DetailActivity中,但我无法做到这一点。

0 个答案:

没有答案