[英]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。如果这些数字相同,则您的活动可能会占用事件队列。 ..”
现在显然问题是要以某种方式停止/模拟动画。
我已经从设备->设置->开发人员选项中禁用了所有动画选项,但是仍然在启动活动时看到图像旋转,所以这无济于事。
我也研究了禁用动画以进行Espresso测试,但这也没有太大帮助。 我本来可能做错了,但无论如何,这没有帮助。
另一个选择是使用特殊意图启动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
AnimationUtil
的MockAnimationUtil
,并重写和方法。
public Animation getWhateverAnimation(int duration){
return super.getWhateverAnimation(0);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.