java - 如何在 Espresso 中允许繁忙的工作线程

标签 java android android-espresso android-testing

我正在尝试测试应用程序的进度指示器,它在 View 模型获取数据时显示不确定的进度指示器。

为了对此进行测试,我正在模拟返回数据的提供程序并使其阻塞,直到我的测试给出告诉它继续进行。基本设置如下所示:

@Test
public void testProgressIndicator() {
    injectProvider(mockProvider);
    startTestActivity();

    // The mock provider now runs on a worker thread and won't finish
    // until we tell it to.

    // We should now see a progress indicator.
    onView(withId(R.id.progress_indicator)).check(
        matches(withEffectiveVisibility(Visibility.VISIBLE)));

    // Tell the worker thread to finish up.
    mockProvider.setResult();

    // The worker thread now returns a result, the progress indicator
    // should be gone.
    onView(withId(R.id.progress_indicator)).check(
        matches(withEffectiveVisibility(Visibility.GONE)));
}

此代码是旧代码,因此提供者使用 AsyncTask 在工作线程上使用阻塞代码。

但是,Espresso 通常会等待所有工作人员完成,以确保结果不依赖于时间。特别是,它使用 AsyncTaskPoolMonitor 等待所有挂起的 AsyncTask 对象。这通常很好,但就我而言,我希望在 Espresso 继续时该线程保持忙碌。我如何告诉 Espresso 不要等待这个特定的线程?

廉价的逃避只是一个 Thread 并通过 Handler 或类似的东西进行通信,但最好找到一个解决方案同时保留使用的设置异步任务

当我进入调试器时,我看到我的测试运行器线程卡在了第一个 check() 上:

wait:-1, Object (java.lang)
parkFor$:2137, Thread (java.lang)
park:358, Unsafe (sun.misc)
park:190, LockSupport (java.util.concurrent.locks)
await:2059, AbstractQueuedSynchronizer$ConditionObject (java.util.concurrent.locks)
take:442, LinkedBlockingQueue (java.util.concurrent)
gatherAnyResult:83, InteractionResultsHandler (androidx.test.espresso)
gatherAnyResult:52, InteractionResultsHandler (androidx.test.espresso)
waitForAndHandleInteractionResults:314, ViewInteraction (androidx.test.espresso)
check:300, ViewInteraction (androidx.test.espresso)
testProgressIndicator:76, MyFragmentTest (com.my.test)  <<< ***********************
invoke:-1, Method (java.lang.reflect)
runReflectiveCall:50, FrameworkMethod$1 (org.junit.runners.model)
run:12, ReflectiveCallable (org.junit.internal.runners.model)
invokeExplosively:47, FrameworkMethod (org.junit.runners.model)
evaluate:17, InvokeMethod (org.junit.internal.runners.statements)
evaluate:80, RunBefores (androidx.test.internal.runner.junit4.statement)
evaluate:531, ActivityTestRule$ActivityStatement (androidx.test.rule)
evaluate:20, RunRules (org.junit.rules)
runLeaf:325, ParentRunner (org.junit.runners)
runChild:78, BlockJUnit4ClassRunner (org.junit.runners)
runChild:57, BlockJUnit4ClassRunner (org.junit.runners)
run:290, ParentRunner$3 (org.junit.runners)
schedule:71, ParentRunner$1 (org.junit.runners)
runChildren:288, ParentRunner (org.junit.runners)
access$000:58, ParentRunner (org.junit.runners)
evaluate:268, ParentRunner$2 (org.junit.runners)
run:363, ParentRunner (org.junit.runners)
run:104, AndroidJUnit4 (androidx.test.ext.junit.runners)
runChild:128, Suite (org.junit.runners)
runChild:27, Suite (org.junit.runners)
run:290, ParentRunner$3 (org.junit.runners)
schedule:71, ParentRunner$1 (org.junit.runners)
runChildren:288, ParentRunner (org.junit.runners)
access$000:58, ParentRunner (org.junit.runners)
evaluate:268, ParentRunner$2 (org.junit.runners)
run:363, ParentRunner (org.junit.runners)
run:137, JUnitCore (org.junit.runner)
run:115, JUnitCore (org.junit.runner)
execute:56, TestExecutor (androidx.test.internal.runner)
onStart:388, AndroidJUnitRunner (androidx.test.runner)
run:2075, Instrumentation$InstrumentationThread (android.app)

最佳答案

你应该计数空闲资源, 在AsyncTask的onPreExecute()中调用increment(),在onPostExecute()中调用decrement()

https://developer.android.com/reference/androidx/test/espresso/idling/CountingIdlingResource.html

关于java - 如何在 Espresso 中允许繁忙的工作线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317901/

相关文章:

android - 在 Android 中设置 ListViews 大小的可能方法?

android - 带有多行提示的 EditText

android - 测试框架意外退出 - ClassNotFound 异常

android - 使用 Dagger2 注入(inject)的 Espresso 测试

java - 克服 Hibernate 5 连接限制

java - SSLv2Hello - javax.net.ssl.SSLException : Received fatal alert: unexpected_message

java - 使用嵌套 HashMap 实现 TRIE?

java - 按下时如何使按钮变大? (安卓工作室)

android - 使用 espresso 在 Web View 中查找多个元素

java - Hibernate 映射错误 - 未知实体