当前位置: 首页 > 知识库问答 >
问题:

在设备入侵测试期间,“动画器只能在活套线程上运行”

刘星火
2023-03-14

这是我的测试代码:

@RunWith(AndroidJUnit4.class)
@SmallTest
public class WelcomeActivityTests extends BaseTest {

    ApplicationController applicationController;

    @Rule
    public ActivityTestRule<WelcomeActivity> activityTestRule = new ActivityTestRule<>(WelcomeActivity.class);

    ArgumentCaptor<Callback> argumentCaptor;

    @Before
    @Override public void setUp() {
        applicationController = (ApplicationController) InstrumentationRegistry.getTargetContext().getApplicationContext();
        applicationController.setMockMode(true);
        argumentCaptor = ArgumentCaptor.forClass(Callback.class);
        super.setUp();
    }

    @Test
    public void testLogin() throws InterruptedException {

        onView(withId(R.id.btnLogInW)).perform(click());
        onView(withId(R.id.email)).perform(typeText("good.email@example.com"));
        onView(withId(R.id.passL)).perform(typeText("strong.password"));
        onView(withId(R.id.btnLogInL)).perform(click());

        User user = new User();
        user.first_name = "Fake name";
        user.last_name = "Fake name";
        user.id = 1;
        user.email = "fake.email@gmail.com";

        AuthResponse authResponse = new AuthResponse();
        authResponse.api_key = "fake_api_key";
        authResponse.status = "ok";
        authResponse.user = user;

        Mockito.verify(api).login(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), argumentCaptor.capture());
        argumentCaptor.getValue().success(authResponse, null);

        assert true;
    }

    @After
    public void release() {
        applicationController.setMockMode(false);
    }

}

我用espresso点击的按钮是基于材料主题的,它们可能在下面有一些动画。结果是,当我试图运行一些入侵测试时,每次执行单击时应用程序都会崩溃。我试图在系统开发人员选项中关闭动画,但没有帮助。

Android.util.AndroidRuntimeException:Animators只能在Android.animation.valueanimator.start(valueanimator.java:1002),Android.animation.valueanimator.start(valueanimator.java:1050),Android.animation.valueanimator.start(objectanimator.java:829),Android.animation.objectanimator.start(animatorset.java:585),Android.animation.statelistanimator.java:187),在Android.widget.textview.drawableStateChanged(View.java:15988)在Android.view.view.drawableStateChanged(textview.java:3659)在Android.view.view.refreshdrawableState(View.java:16032)在Android.view.view.refreshdrawableState(View.java:16024)在Android.view.view.setenabled(view.java:6724)在Android.view.view.setenabled(Ragment.java:222)在my.app.welcomeActivityTests.testrat(welcomeActivityTests.java:84)在java.lang.reflect.Method.invoke(原生方法)在java.lang.reflect.Method.invoke(Method.java:372)在org.junit.runners.model.frameworkMethod$1.1.runreflectiveCall(FrameworkMethod.java:45)在invokeMethod.java:20)在org.junit.internal.runners.statements.runbefores.evaluate(runbefores.java:28)在org.junit.internal.runners.statements.runafters.evaluate(runafters.java:30)在android.support.test.statement.uithreadstatement.evaluate(runafters.java:55)在android.support.test.statement.uithreadstatement.evaluate(R.java:263)在org.junit.runners.blockJunit4ClassRunner.runchild(blockJunit4ClassRunner.java:68)在org.junit.runners.blockJunit4ClassRunner.runchild(blockJunit4ClassRunner.java:47)在org.junit.runners.parentRunner$3.run(parentRunner.java:231)在org.junit.runners.parentRunner$1在parentrunner.java:222)在org.junit.runners.parentrunner.run(parentrunner.java:300)在org.junit.runners.suite.runchild(Suite.java:128)在org.junit.runners.suite.runchild(Suite.java:24)在org.junit.runners.parentrunner$3.run(parentrunner.java:24)在org.junit.runners.parentrunner$3.run.runners.parentrunner$2.evaluate(ParentRunner.java:222)在org.junit.runners.parentrunner.run(parentrunner.java:300)在org.junit.runner.junitcore.run(junitcore.java:157)在org.junit.runner.junitcore.run(junitcore.java:157)在org.junit.runner.junitcore.run(junitcore.java:136)在

这就是我的应用程序崩溃的台词:

btnFacebook.setEnabled(false);

编辑:我找到了合适的解决方案,寻找公认的答案。

共有1个答案

商振
2023-03-14

好的,我找到了妥善的解决办法!当处理使用处理程序的库和API时,您需要用@UithReadTest注释您的测试用例。此外,应该使用runOnMainSync(Runnable r)检测方法调用您要进行stubbing的每个asynchronouos回调。示例:

    @Test
    @UiThreadTest
    public void testLoginSuccess() {

        Instrumentation.ActivityMonitor monitor = InstrumentationRegistry.getInstrumentation().addMonitor(EventsListActivity.class.getName(), null, true);

        onView(withId(R.id.btnLogInW)).perform(click());
        onView(withId(R.id.email)).perform(typeText("good.email@example.com"));
        onView(withId(R.id.passL)).perform(typeText("strong.password"));
        onView(withId(R.id.btnLogInL)).perform(click());

        User user = new User();
        user.first_name = "Fake name";
        user.last_name = "Fake name";
        user.id = 1;
        user.email = "fake.email@gmail.com";

        final AuthResponse authResponse = new AuthResponse();
        authResponse.api_key = "fake_api_key";
        authResponse.status = "ok";
        authResponse.user = user;

        Mockito.verify(api).login(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), argumentCaptor.capture());
        InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
            @Override public void run() {
                argumentCaptor.getValue().success(authResponse, null);
            }
        });

        assertThat(1, equalTo(monitor.getHits()));
        InstrumentationRegistry.getInstrumentation().removeMonitor(monitor);
    }
 类似资料:
  • 这是我的测试代码: 我用浓缩咖啡点击的按钮是基于材质主题的,下面可能有一些动画。结果是,当我试图运行一些指令测试时,每次我点击一次,应用程序就会崩溃。我试着在系统开发者选项中关闭动画,但没用。 Androidutil。AndroidRuntimeException:动画师只能在android的活套线程上运行。动画我是动画师。在android上启动(ValueAnimator.java:1002)。

  • 和push_left_out.xml: 在主活动Stage1Activity I中有: 现在,当我在活动中移动时,过渡按其应有的方式工作。新的活动将旧的活动从右推到左。我想要一个反向的效果,当用户按下他们的设备上的后退按钮,但同样的过渡动画播放出来。我玩过Android:fromxdelta标签,取得了一些非常奇怪的结果,但我不知道如何设置它,以便在按下设备上的后退按钮时,新活动(实际上是一个新调

  • 我正在评估运行移动web测试的AWS设备场。以下是我预期的步骤: 创建样本测试(Java) 打包为zip文件 通过AWS设备场控制台,仅上传测试zip 手动选择配置和其他东西 手动执行测试并评估结果 我需要帮助的事情是: a)如果测试需要一些更改,我是否需要在每次运行中完成JAR包的创建?我可以从我的IDE运行测试,如果一切正常,然后只打包并上传到AWS设备场? b) 我注意到他们有API来模拟步

  • TL;DR:我只能对某个设备运行一次测试,然后每隔一次尝试将我的应用程序连接到ADB会话,手动或通过Appium服务器调用,都会失败。如何解决这个问题,以便能够恢复自动化测试? 我的设备的Appium desired_capabilities包括。除设备标识符之外的所有其他desired_capabilities都在所有其他设备之间共享并适用于所有其他设备。 直到将添加到一个测试中,才观察到此错误

  • 问题内容: 我们一直在计划使用Selenium对我们的Web应用程序进行UI测试。我们现在有第二个想法。据我所知,Android和iOS设备的网络驱动程序并未使用用户会使用的实际浏览器。相反,他们使用的WebView可能与实际的浏览器相似,也可能不同。我看过许多关于Android的报告,这些报告似乎表明WebView的行为不同于内置浏览器和Chrome的行为,而Chrome现在是某些设备上的默认设

  • 这个小部件在模拟器4.1.2上工作得很好,当安装在真正的设备上时,它甚至不会显示在小部件列表上,就像安装了一样,但我不能让它正常工作。 下面是manifest.xml 和小部件提供程序

  • 在我的应用程序中,对于特定的< code>EditText,我希望句子的第一个字母是大写字母。所以我用了< code > Android:input type = " textCapSentences " 。 奇怪的是这适用于模拟器,但不适用于模拟器。我什至尝试了,即使它已被弃用,但它不起作用。 相关事实: > 模拟器操作系统:4.0.3 真实设备操作系统:4.0.4 应用minSdk版本:2.3

  • 这是一个场景:活动包含片段,它反过来使用在其中添加片段和像这样: 到目前为止,一切正常。 然后我们在活动中运行以下事务: 在转换过程中,片段B的enter动画运行正常,但片段A1和A2完全消失。当我们使用后退按钮还原事务时,它们会正确初始化,并在弹出键动画期间正常显示。 在我的简短测试中,情况变得更奇怪了——如果我为子片段设置动画(见下文),当我们添加片段时,退出动画会断断续续地运行 我想要实现的