当前位置 : 主页 > 手机开发 > android >

如何对具有View Animators的Android代码进行单元测试?

来源:互联网 收集:自由互联 发布时间:2021-06-11
我有一个实例,其中显示和隐藏了几个按钮,具体取决于ViewPager中的哪个页面正在显示.使用Animators显示和隐藏.有没有办法检查/延迟单元测试,直到完成为止? 我正在使用Robolectric,因为这可
我有一个实例,其中显示和隐藏了几个按钮,具体取决于ViewPager中的哪个页面正在显示.使用Animators显示和隐藏.有没有办法检查/延迟单元测试,直到完成为止?

我正在使用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,并将动画逻辑放在那里.

希望这可以帮助!

网友评论