在协同程序中阻止Android检测

在协同程序中阻止Android检测,android,kotlin,coroutine,android-espresso,Android,Kotlin,Coroutine,Android Espresso,我的活动有一个编辑文本和一个按钮。按下按钮时,将调用长时间运行的功能。在此期间,应禁用编辑文本。函数完成后,应重新启用EditText。这在运行应用程序时效果很好,但是我编写了一个Espresso单元测试来测试这种行为,它的行为似乎不正确 长时间运行功能似乎会暂停单元测试,该测试需要3秒以上的时间才能运行。一旦长时间运行的函数完成,单元测试就会测试EditText是否被禁用,而当任务完成时它不再是,并且加载变量被设置回false 我希望单元测试启动该函数,因为它是在一个协同程序中运行的,它将继续

我的活动有一个编辑文本和一个按钮。按下按钮时,将调用长时间运行的功能。在此期间,应禁用编辑文本。函数完成后,应重新启用EditText。这在运行应用程序时效果很好,但是我编写了一个Espresso单元测试来测试这种行为,它的行为似乎不正确

长时间运行功能似乎会暂停单元测试,该测试需要3秒以上的时间才能运行。一旦长时间运行的函数完成,单元测试就会测试EditText是否被禁用,而当任务完成时它不再是,并且
加载
变量被设置回
false

我希望单元测试启动该函数,因为它是在一个协同程序中运行的,它将继续到下一行检查EditText是否被禁用

我已经尝试了CommonPool、UI、launch、async、Deferred等的所有不同变体,但似乎都没有得到正确的行为

suspend fun getData(): String {
    // simulate network request delay
    delay(3000)                       
    return "Hello, world!"
}


一般来说,您不应该处理视图中的任何逻辑(活动、片段等),而应该在单独的逻辑处理程序(如ViewModel、Presenter或..)中完成

您可以
spy
使用框架(如Mockito或MockK)监视您的活动,并模拟
getData()
方法以始终快速返回,这样您的测试用例就不需要等待它了

要使用mockito监视您的活动,您可以使用answer中的信息,并在(activity.getData())时使用
when。然后返回(“”)
,以模拟该方法。由于您正在模拟协同程序,因此需要使用
runBlocking
来运行测试

class MainActivityTest {
    internal var subject: MainActivity

    val activityFactory: SingleActivityFactory<MainActivity> =
        object : SingleActivityFactory<MainActivity>(MainActivity::class.java) {
            protected fun create(intent: Intent): MainActivity {
                subject = spy(getActivityClassToIntercept())
                return subject
            }
        }

    @Rule
    var testRule: ActivityTestRule<MainActivity> = ActivityTestRule(activityFactory, true, true)

    @Test
    fun sampleTest() = runBlocking<Unit> {
        `when`(subject.getData()).thenReturn("")
        //verify(subject).
    }

}
类维护活动测试{
内部风险值主体:主要活动
val activityFactory:SingleActivityFactory=
对象:SingleActivityFactory(MainActivity::class.java){
受保护的乐趣创建(意图:意图):主要活动{
subject=spy(getActivityClassToIntercept())
返回主题
}
}
@统治
var testRule:ActivityTestRule=ActivityTestRule(activityFactory,true,true)
@试验
fun sampleTest()=运行阻塞{
`当`(subject.getData())。然后返回(“”)
//核实(主题)。
}
}

可能有一些IdlingResource正在等待协同路由完成?
@Test
fun disableEditText() {
    // check the EditText starts off enabled
    onView(withId(R.id.edit_text))
            .check(matches(isEnabled()))

    // click the Button to simulate the network call
    onView(withId(R.id.button))
            .perform(click())

    // check the EditText is disabled
    onView(withId(R.id.edit_text))
            .check(matches(not(isEnabled()))
}
class MainActivityTest {
    internal var subject: MainActivity

    val activityFactory: SingleActivityFactory<MainActivity> =
        object : SingleActivityFactory<MainActivity>(MainActivity::class.java) {
            protected fun create(intent: Intent): MainActivity {
                subject = spy(getActivityClassToIntercept())
                return subject
            }
        }

    @Rule
    var testRule: ActivityTestRule<MainActivity> = ActivityTestRule(activityFactory, true, true)

    @Test
    fun sampleTest() = runBlocking<Unit> {
        `when`(subject.getData()).thenReturn("")
        //verify(subject).
    }

}