我有:
onView(withId(R.id.login_email_textview)).perform(clearText(), closeSoftKeyboard());
onView(withId(R.id.password_edittext)).perform(clearText(), closeSoftKeyboard());
onView(withId(R.id.login_email_textview)).perform(typeText(email), closeSoftKeyboard());
onView(withId(R.id.password_edittext)).perform(typeText(password), closeSoftKeyboard());
onView(withId(R.id.email_sign_in_button)).perform(click());
intended(hasComponent(new ComponentName(getTargetContext(), MainActivity.class)));
按下登录按钮后,将显示“加载”对话框,Async任务会调用服务器以检查凭据。在响应LoginActivity后,我测试了finish()并启动了MainActivity。
按下登录按钮后测试挂起。 还使用:
@Rule
public IntentsTestRule<LoginActivity> mActivityRule = new IntentsTestRule<>(LoginActivity.class);
同样在I / m调用startActivity()后的代码中,我在LoginActivity上调用了finish()。
在sign_in_button上我打电话给Volley请求。
答案 0 :(得分:1)
我认为,LoadingDialog
正在显示动画ProgressBar
。
一起使用ProgressBar
和Volley
实际上并不是一个坏主意。 ProgressBar
会强制Espresso
等待Volley
在后台完成工作。
我认为,您的测试“挂起”,因为您不会忽略LoadingDialog
。因此,要解决此问题,请在收到LoadingDialog
的回复后撤消Volley
。但请勿使用Espresso
来解除LoadingDialog
。
单独使用ProgressBar
和Volley
时存在“已知问题”:
ProgressBar
如果LoadingDialog
显示动画ProgressBar
,则动画会阻止Espresso
。动画使应用程序的主线程保持忙碌状态,Espresso
等待它超时。
Volley
Espresso
不了解Volley
。如果Volley
在后台线程中执行请求(我希望这样做),Espresso
不会等待,并且您的测试可能会在Volley
返回响应之前结束。
可以使用IdlingResource
使Espresso
等待任何事情。
答案 1 :(得分:0)
所以这是我提出的解决方案:
自定义IdlingResource:
public class VolleyIdlingResource implements IdlingResource {
private static final String TAG = "VolleyIdlingResource";
private final String resourceName;
// written from main thread, read from any thread.
private volatile ResourceCallback resourceCallback;
private Field requests;
private RequestQueue requestQueue;
public VolleyIdlingResource(String resourceName, Context context) throws SecurityException, NoSuchFieldException {
this.resourceName = checkNotNull(resourceName);
requestQueue = MyApplication.get(context).getRequestQueue();
requests = RequestQueue.class.getDeclaredField("requests");
requests.setAccessible(true);
}
@Override
public String getName() {
return resourceName;
}
@Override
public boolean isIdleNow() {
try {
Set<Request> set = (Set<Request>) requests.get(requestQueue);
int count = set.size();
if (set != null) {
if (count == 0) {
resourceCallback.onTransitionToIdle();
} else {
}
return count == 0;
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
}
然后在测试中:
VolleyIdlingResource volleyResources;
try {
volleyResources = new VolleyIdlingResource("VolleyCalls", mActivityRule.getActivity());
registerIdlingResources(volleyResources);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
intended(hasComponent(new ComponentName(getTargetContext(), MainActivity.class)));