我有一个实例,其中显示和隐藏了几个按钮,具体取决于ViewPager中的哪个页面正在显示.使用Animators显示和隐藏.有没有办法检查/延迟单元测试,直到完成为止? 我正在使用Robolectric,因为这可
我正在使用Robolectric,因为这可能是相关的.我试着调用Robolectric.runUiThreadTasksIncludingDelayedTasks();但这似乎没有解决任何问题.
动画代码如下:
public static void regularFadeView(final boolean show, final View view) { view.animate() .setInterpolator(mDecelerateInterpolator) .alpha(show ? 1 : 0) .setListener(new SimpleAnimatorListener() { @Override public void onAnimationStart(Animator animation) { if (show) view.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { if (!show) view.setVisibility(View.INVISIBLE); } }) .start(); }我认为你可以解决这个问题,重新安排方法.这是通过将SimpleAnimatorListener提取到受保护变量,然后基于该单元进行单元测试.就像是:
@VisibleForTesting SimpleAnimatorListener getAnimationListener(boolean show, View view) { return new SimpleAnimatorListener() { @Override public void onAnimationStart(Animator animation) { if (show) view.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { if (!show) view.setVisibility(View.INVISIBLE); } } public static void regularFadeView(boolean show, View view) { view.animate() .setInterpolator(mDecelerateInterpolator) .alpha(show ? 1 : 0) .setListener(getAnimationListener(show, view)) .start(); }
然后在你的测试:
private void shouldShowViewWhenShowIsTrue() { View mockedView = Mockito.mock(View.class); SimpleAnimatorListener animationListener = getAnimationListener(true, mockedView); animationListener.onAnimationStart(null); Mockito.verify(mockedView).setVisibility(View.VISIBLE); }
更好的方法是使用getAnimationListener()等方法来创建一个扩展SimpleAnimatorListener的FadeAnimationListener,并将动画逻辑放在那里.
希望这可以帮助!