Back to Repositories

Testing View Property Animation Transitions in Glide

This test suite validates the ViewPropertyAnimation functionality in Glide’s transition system, focusing on property animations for views during image loading transitions. It ensures proper animation handling and view state management.

Test Coverage Overview

The test suite covers core view property animation behaviors in Glide’s transition system.

Key areas tested include:
  • Animation return value verification
  • View animation triggering logic
  • Null view handling safety checks
  • Proper animator interaction with ImageView instances

Implementation Analysis

The testing approach utilizes Robolectric for Android view testing, combined with Mockito for behavior verification. The tests employ a systematic pattern of mocking view adapters and animators to isolate transition behavior verification.

Framework-specific features include:
  • Robolectric test runner configuration
  • Mock-based verification patterns
  • Android context integration

Technical Details

Testing tools and configuration:
  • JUnit test framework
  • Robolectric for Android environment simulation
  • Mockito for mocking and verification
  • Custom SDK configuration for Robolectric
  • ApplicationProvider for context access

Best Practices Demonstrated

The test suite exemplifies high-quality testing practices through focused test methods and comprehensive edge case coverage.

Notable practices include:
  • Proper test setup isolation using @Before
  • Clear test method naming conventions
  • Explicit null case handling
  • Mock-based dependency isolation
  • Focused single-responsibility test methods

bumptech/glide

library/test/src/test/java/com/bumptech/glide/request/transition/ViewPropertyAnimationTest.java

            
package com.bumptech.glide.request.transition;

import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK;
import static org.junit.Assert.assertFalse;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.view.View;
import android.widget.ImageView;
import androidx.test.core.app.ApplicationProvider;
import com.bumptech.glide.request.transition.Transition.ViewAdapter;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
@Config(sdk = ROBOLECTRIC_SDK)
public class ViewPropertyAnimationTest {
  private ViewPropertyTransition.Animator animator;
  private ViewPropertyTransition<Object> animation;

  @Before
  public void setUp() {
    animator = mock(ViewPropertyTransition.Animator.class);
    animation = new ViewPropertyTransition<>(animator);
  }

  @Test
  public void testAlwaysReturnsFalse() {
    assertFalse(animation.transition(new Object(), mock(ViewAdapter.class)));
  }

  @Test
  public void testCallsAnimatorWithGivenView() {
    ImageView view = new ImageView(ApplicationProvider.getApplicationContext());
    ViewAdapter adapter = mock(ViewAdapter.class);
    when(adapter.getView()).thenReturn(view);
    animation.transition(new Object(), adapter);

    verify(animator).animate(eq(view));
  }

  @Test
  public void testDoesNotCallAnimatorIfGivenAdapterWithNullView() {
    ViewAdapter adapter = mock(ViewAdapter.class);
    animation.transition(new Object(), adapter);

    verify(animator, never()).animate(any(View.class));
  }
}