我正在尝试对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
中,但我无法做到这一点。