I have an instance where a couple buttons are shown and hidden depending on which page in a ViewPager is being shown. The are shown and hidden with Animators. Is there a way to check for/delay unit testing until this has been completed?
I'm using Robolectric since that's probably relevant. I tried calling Robolectric.runUiThreadTasksIncludingDelayedTasks();
but this didn't seem to fix anything.
The animation code is as follows:
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();
}
I think you could solve this problem rearranging the approach. This is, by extracting the SimpleAnimatorListener to a protected variable, and then unit test based on that. Something like:
@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();
}
And then on your test:
private void shouldShowViewWhenShowIsTrue() {
View mockedView = Mockito.mock(View.class);
SimpleAnimatorListener animationListener = getAnimationListener(true, mockedView);
animationListener.onAnimationStart(null);
Mockito.verify(mockedView).setVisibility(View.VISIBLE);
}
Even better could be to have instead of a method like getAnimationListener(), would be to create a FadeAnimationListener that would extend SimpleAnimatorListener, and put the animation logic there.
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With