繁体   English   中英

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

[英]How to mock a custom ImageView for activity unit testing

我有一个LoginActivity ,它在onResume()加载了SplashFragment

初始片段的布局XML包含一个名为RotatingImageView的自定义ImageView ,顾名思义,该ImageView在将源图像附加到Window后即开始旋转。

现在,当我尝试使用ActivityInstrumentationTestCase2<LoginActivity>编写LoginActivity的单元测试时,这会引起问题。 我正在尝试在真实设备(无根)而非模拟器上运行测试。

getActivity()调用开始活动,但是由于旋转的图像视图(动画是顺便说一句),浓缩咖啡被卡住了。 我知道意式浓缩咖啡不喜欢在那里播放动画。 我有例外

“浓缩咖啡无法在45秒内启动意图。也许主线程在合理的时间内没有空闲?可能存在动画或不断在重新绘制屏幕的东西。或者活动正在创建时进行网络调用?请参阅作为参考,事件队列在活动启动请求之前的最后一次空闲时间为1487296262885,现在队列的最后空闲时间为:1487296262885。如果这些数字相同,则您的活动可能会占用事件队列。 ..”

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

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

  2. 我也研究了禁用动画以进行Espresso测试,但这也没有太大帮助。 我本来可能做错了,但无论如何,这没有帮助。

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

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

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

是的,有可能,您可以创建一个名为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;
}

并在您的androidTest包(不是main包)中创建一个extend AnimationUtilMockAnimationUtil ,并重写和方法。

public Animation getWhateverAnimation(int duration){
    return super.getWhateverAnimation(0);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM