@Rule
public ActivityTestRule<LoginTestActivity> mLoginActivityTestRule = new ActivityTestRule<>(LoginTestActivity.class);
@Test
public void loginWithTwitter() throws Exception
{
mLoginActivityTestRule.getActivity().performLogin();
}
当我正常运行应用程序时,上面的performLogin函数工作正常,但是当我在单元测试中运行它时,我得到了这个可怕的异常:
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
错误行是我在主线程上使用以下方式显示Toast的地方:
Toast.makeText(getApplicationContext(),“Login Success!”,Toast.LENGTH_LONG).show();
当我将其作为单元测试运行时,为什么会失败?我猜一个ActivityTestRule以某种方式在它自己的线程上运行,并且它不被Android视为主线程.我该如何解决?
我尝试传入getInstrumentation().getTargetContext()作为Toast的上下文但发生了同样的错误.我应该在调用中包装每个toast显示以明确地在UI线程上运行吗?
最佳答案 有几种解决方案:
>使用支持库中的@UiThreadTest批注对测试进行批注.
要么
>调用mLoginActivityTestRule.runOnUiThread仅在UI线程上运行测试部分.
希望其中一个解决方案能解决您的问题.