在浓缩咖啡测试超时,测试不运行

有一个辅助类DialogIdlingResource,我试着运行我的测试。 测试发生,除了这一个。 按下按钮后,一切都停止。

AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) 

带有两个辅助方法的代码片段:

  @Test fun signInUserWithInvalidEmail() { goToSignIn() AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_email, "kokojambo@mail.ru") AcceptanceHelper.updateValidationTextView(R.string.ui_data_attribute_password, VALID_PASSWORD) AcceptanceHelper.clickOnButtonInLayout(R.id.mainSignButton, R.string.common_signin_button_text, R.id.inputLayout) val idlingResource = DialogIdlingResource() registerDialogIdlingResource() unregisterDialogIdlingResource() } private fun registerDialogIdlingResource() { val instrumentation = InstrumentationRegistry.getInstrumentation() idlingResource = DialogIdlingResource() Espresso.registerIdlingResources(idlingResource) } private fun unregisterDialogIdlingResource() { Espresso.unregisterIdlingResources(idlingResource) } 

可能由于regester和unregister(idlingResource)两种方法导致的错误,

但实际上它应该可以工作,但也可能是某个可能犯了错误的地方,即辅助类代码:

 class DialogIdlingResource(private val waitTimeSeconds: Int = 5) : IdlingResource { private var resourceCallback: IdlingResource.ResourceCallback? = null private var startTime = -1L override fun getName(): String { return DialogIdlingResource::class.java.name } override fun isIdleNow(): Boolean { if (startTime < 0) { startTime = System.currentTimeMillis() } val timeOut = System.currentTimeMillis() - waitTimeSeconds * 1000 > startTime if (timeOut) throw TimeoutException("error") val idle = !isDialogRunning if (idle && resourceCallback != null) { resourceCallback!!.onTransitionToIdle() } return idle } override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { this.resourceCallback = resourceCallback } private val isDialogRunning: Boolean get() { try { onView(Matchers.allOf(withId(R.id.titleTextView), ViewMatchers.withText("Warning"))) .check(ViewAssertions.matches(isDisplayed())) } catch (e: NoMatchingViewException) { e.printStackTrace() System.out.println("some text") } return true } 

尝试解决下一个解决方案的问题。 而当我运行一个我的测试,所有的作品是好的。 但是,如果我开始所有的测试,我会发现错误。 因为测试没有时间检查我的对话框中的文本,他打开对话框,这是全部。

IdlingResource类:

 class ElapsedTimeIdlingResource(private val activity: SignActivity?) : IdlingResource { private var callback: IdlingResource.ResourceCallback? = null override fun getName(): String { return "SignInScreenTest" } override fun isIdleNow(): Boolean { val idle = isIdle if (idle) callback!!.onTransitionToIdle() return idle } val isIdle: Boolean get() = activity != null && callback != null override fun registerIdleTransitionCallback(resourceCallback: IdlingResource.ResourceCallback) { this.callback = resourceCallback } 

}

在我的测试

 val activity = mActivityTestRule.getActivity() val idlingResource = ElapsedTimeIdlingResource(activity) Espresso.registerIdlingResources(idlingResource) AcceptanceHelper.checkTextView(R.id.titleTextView, "Warning") 

我再说一遍,就在我开始所有测试的时候,我需要在registerIdlingResources和checktextView之间进行一些睡眠,如下所示:

 SystemClock.sleep(5000) 

请帮忙解决这个问题。 对不起,我的英语。

对不起,但你的IdlingResource看起来像超级复杂的等待功能。

这段代码适用于我 – github链接 。 你只需要提供必要的参数给ViewVisibilityIdlingResource构造函数。 其中之一是int viewId和另一个int visibility 。 例如,如果您从对话框布局和可见性View.GONE提供任何viewId ,则此资源将阻止Espresso测试,直到视图可见或直到向用户显示对话框。

虽然没有赶上kotlin的语法。

isIdle()总是在主线程上执行,它应该是非阻塞的。 因此,不要在isIdle()中调用isDialogRunning(),而是在单独的线程中调用它,并更新idlingResource的状态(如果视图匹配或超时),然后可以通过isIdle()进行检查。

希望它有助于:)