使用 Cucumber 和 RxJava 在 AndroidTest 中进行活动清理

问题描述 投票:0回答:1

我在黄瓜测试结束时观察到一个奇怪的堆栈跟踪。 我的测试基于 cucumber-jvm android 示例。我使用 RxJava2 在 @Then 方法中执行一些异步过程。没有异步过程一切都很好。

测试成功,但是在 @After cucumber 方法期间发生了一些事情。看来跑步者没有等到正确完成活动。我尝试使用规则 finishActivity 方法或在 finish 方法之后放置 waitForIdleSync() 方法,但这些都不起作用。 如果我放置 Thread.sleep(1000) 它会完成这项工作,但我想避免依赖我的测试类上的时间常数。

有人遇到过同样的问题吗?并罚款解决办法?

谢谢您的建议。

我的步骤伪代码:

公共课活动步骤{

@Rule
ActivityTestRule<EmptyActivity> rule = new ActivityTestRule<>(EmptyActivity.class, false, false);


@Before
public void launchActivity() throws Exception {
    EmptyActivity appFakeActivity = rule.launchActivity(null);
}

@After
public void finishActivity() throws Exception {
    getActivity().finish();
    // TODO : Inspect stackTrace at the end of the final executed test. It seems that the test runner close before the activity is effectively stopped. 
}

private Activity getActivity() {
    return rule.getActivity();
}

@Given("...")
public void given() {

}

@When("...")
public void when_step() {
   ...
}

@Then("...")
public void valid_M1() {
    Single<String> single = Single.just("qsdf");
    TestObserver<String> observer = new TestObserver<>();
    single
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(observer);

    observer.awaitTerminalEvent();
}

运行器关闭时的堆栈跟踪是:

 I/MonitoringInstr: Unstopped activity count: 1
    I/MonitoringInstr: Unstopped activity count: 1
    I/MonitoringInstr: Unstopped activity count: 1
    I/MonitoringInstr: Unstopped activity count: 1
    E/THREAD_STATE:   Thread[FinalizerWatchdogDaemon,5,system]
                    java.lang.Thread.sleep(Native Method)
                    java.lang.Thread.sleep(Thread.java:1031)
                    java.lang.Thread.sleep(Thread.java:985)
                    java.lang.Daemons$FinalizerWatchdogDaemon.sleepFor(Daemons.java:257)
                    java.lang.Daemons$FinalizerWatchdogDaemon.waitForFinalization(Daemons.java:268)
                    java.lang.Daemons$FinalizerWatchdogDaemon.run(Daemons.java:216)
                    java.lang.Thread.run(Thread.java:818)

                  Thread[Instr: com.schneider.electric.forum.integration.m1.test.CucumberRunner,5,main]
                    dalvik.system.VMStack.getThreadStackTrace(Native Method)
                    java.lang.Thread.getStackTrace(Thread.java:580)
                    java.lang.Thread.getAllStackTraces(Thread.java:522)
                    android.support.test.runner.MonitoringInstrumentation.getThreadState(MonitoringInstrumentation.java:636)
                    android.support.test.runner.MonitoringInstrumentation.dumpThreadStateToOutputs(MonitoringInstrumentation.java:631)
                    android.support.test.runner.MonitoringInstrumentation.waitForActivitiesToComplete(MonitoringInstrumentation.java:384)
                    android.support.test.runner.MonitoringInstrumentation.finish(MonitoringInstrumentation.java:347)
                    cucumber.api.android.CucumberInstrumentationCore.start(CucumberInstrumentationCore.java:92)
                    com.schneider.electric.forum.integration.m1.test.CucumberRunner.onStart(CucumberRunner.java:44)
                    android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837)

                  Thread[FinalizerDaemon,5,system]
                    java.lang.Object.wait(Native Method)
                    java.lang.Object.wait(Object.java:422)
                    java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:101)
                    java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:72)
                    java.lang.Daemons$FinalizerDaemon.run(Daemons.java:173)
                    java.lang.Thread.run(Thread.java:818)

                  Thread[JDWP,5,system]

                  Thread[Binder_2,5,main]

    ...
    W/MonitoringInstr: Still 1 activities active after waiting 2000 ms.
    I/MonitoringInstr: waitForActivitiesToComplete() took: 2042msTests ran to completion.
android rx-java2 android-testing rx-android cucumber-jvm
1个回答
0
投票

这可能有助于提供一些解释:

https://github.com/android/android-test/issues/211

但除了使用

Thread.sleep()
添加定时等待之外,似乎没有其他建议的解决方案,正如您已经尝试过的那样。这应该确保活动有机会完成。

或者,您可以尝试从

ActivityTestRule
迁移到
ActivityScenario

© www.soinside.com 2019 - 2024. All rights reserved.