我正在尝试使用 Robolectric 来验证 Lottie 动画是否正在播放。
ExampleUnitTest.java:
@Test
public void lottie_isAnimating() {
MainActivity activity = Robolectric.setupActivity(MainActivity.class);
LottieAnimationView lottieAnimationView = (LottieAnimationView) activity.findViewById(R.id.lottieanimation);
assertTrue(lottieAnimationView.isAnimating()); // fails here
}
这行不通。但是,我知道动画确实会运行,因为我可以看到它正在运行,并且我添加的 AnimatorListener 表示如下:
MainActivity.java:
lottieAnimationView.addAnimatorListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.d(TAG, "onAnimationStart(): lottieAnimationView.isAnimating() = " + lottieAnimationView.isAnimating());
}
@Override
public void onAnimationEnd(Animator animation) {
Log.d(TAG, "onAnimationEnd(): lottieAnimationView.isAnimating() = " + lottieAnimationView.isAnimating());
}
@Override
public void onAnimationCancel(Animator animation) {
Log.d(TAG, "onAnimationCancel(): lottieAnimationView.isAnimating() = " + lottieAnimationView.isAnimating());
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.d(TAG, "onAnimationRepeat(): lottieAnimationView.isAnimating() = " + lottieAnimationView.isAnimating());
}
});
日志输出显示:
D/com.wuziq.lottierobolectrictest.MainActivity: onAnimationStart(): lottieAnimationView.isAnimating() = true
D/com.wuziq.lottierobolectrictest.MainActivity: onAnimationUpdate(): lottieAnimationView.isAnimating() = true
...
D/com.wuziq.lottierobolectrictest.MainActivity: onAnimationRepeat(): lottieAnimationView.isAnimating() = true
...
D/com.wuziq.lottierobolectrictest.MainActivity: onAnimationEnd(): lottieAnimationView.isAnimating() = true
我不清楚为什么 onAnimationEnd() 被调用,但我不会在任何地方停止动画。我将其视为 Robolectric 如何对待动画师的副作用,但我想了解这一点。
在我的测试中,我可以简单地向 LottieAnimationView 添加一个 AnimationListener 并断言 onAnimationStart() 和 onAnimationRepeat() 被调用,但这似乎是一个 hacky 解决方法。
测试这个的正确方法是什么?我觉得我错过了一些非常明显的东西..