如何模拟自定义ImageView以进行活动单元测试

时间:2017-02-17 05:45:09

标签: android unit-testing android-animation android-imageview android-espresso

我有LoginActivitySplashFragment加载onResume()

启动片段的布局XML包含一个名为ImageView的自定义RotatingImageView,顾名思义,它会在源图像连接到窗口后立即开始旋转。

现在,当我尝试使用LoginActivityActivityInstrumentationTestCase2<LoginActivity>编写单元测试时,这会导致问题。我试图在真实设备(无根)上运行测试,而不是模拟器。

getActivity()调用启动活动,但由于旋转图像视图(动画btw),浓缩咖啡卡住了。我知道浓缩咖啡不喜欢那里的动画。我得到例外

  

“意式浓缩咖啡无法在45秒内启动意图。也许主要是   线程在合理的时间内没有闲置?那里   可能是一个动画或不断重新粉刷屏幕的东西。   或者活动是在创建网络呼叫?请参阅线程转储   日志。以上是事件队列最后一次空闲时的参考   您的活动启动请求是1487296262885,现在是最后一次   队列怠速是:1487296262885。如果这些数字是相同的   你的活动可能会占用事件队列......“

现在显然问题是以某种方式停止/模拟动画。

  1. 我已经从设备中禁用了所有动画选项 - &gt;设置 - &gt;开发人员选项但仍然在启动活动时我看到图像旋转,所以这没有用。

  2. 我也研究过Disable animations for Espresso tests,但这对我没什么帮助。我本来可以做错了,但无论如何,它没有帮助。

  3. 另一种选择是使用特殊意图启动LoginActivity,该意图告诉活动这是在测试下启动的,因此当您加载片段时它会禁用动画。这种方法有效,但它并不理想,因为它涉及在主类中添加纯粹用于测试的代码。

  4. 另一个解决方案可能是模拟RotatingImageView并在开始加载之前将其注入SplashFragment。我会嘲笑对startSpinningAnimation的调用,所以当它加载到Window中时,它不会启动动画。

    我的问题是:有可能吗?在调用imageView之前,我可以以某种方式模拟并将此自定义getActivity()注入我的片段吗?

1 个答案:

答案 0 :(得分:1)

是的,有可能,您可以创建一个名为AnimationUtil的类,将您的动画方法放在该类中并在测试期间模拟它们。

public Animation getWhateverAnimation(int duration){
    RotateAnimation anim = new RotateAnimation(0f, 350f, 15f, 15f);
    anim.setInterpolator(new LinearInterpolator());
    anim.setRepeatCount(Animation.INFINITE);
    anim.setDuration(duration);
    return anim;
}

并在MockAnimationUtil包(不是extend包)中创建AnimationUtil androidTest并覆盖和方法。{/ p>

main