Back to Repositories

Testing ResourceLoader URI Handling Implementation in Glide

A comprehensive test suite for Glide’s ResourceLoader, focusing on Android resource handling and URI loading functionality. This test class validates the ResourceLoader’s ability to handle resource IDs and URI conversion in the Glide image loading library.

Test Coverage Overview

The test suite provides targeted coverage for the ResourceLoader component, specifically examining:

  • Resource ID handling and validation
  • URI conversion for Android resources
  • Error handling for invalid resource IDs
  • Integration with Glide’s ModelLoader interface

Implementation Analysis

The testing approach utilizes JUnit and Robolectric frameworks for Android resource testing. Key patterns include:

  • Mockito for dependency isolation and behavior verification
  • Robolectric for Android resource simulation
  • ApplicationProvider for context access
  • Clean setup and teardown patterns with @Before annotations

Technical Details

Testing infrastructure includes:

  • RobolectricTestRunner for Android environment simulation
  • Mock objects for Uri loader and DataFetcher
  • Options configuration for loader parameters
  • SDK version configuration via @Config annotation
  • Truth assertion library for enhanced verification

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Proper test isolation using mocks
  • Clear test method naming conventions
  • Focused test cases with single responsibility
  • Comprehensive error case handling
  • Efficient test setup with @Before initialization

bumptech/glide

library/test/src/test/java/com/bumptech/glide/load/model/ResourceLoaderTest.java

            
package com.bumptech.glide.load.model;

import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
import com.bumptech.glide.load.Key;
import com.bumptech.glide.load.Options;
import com.bumptech.glide.load.data.DataFetcher;
import com.bumptech.glide.util.Preconditions;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

/** Tests for the {@link com.bumptech.glide.load.model.ResourceLoader} class. */
@RunWith(RobolectricTestRunner.class)
@Config(sdk = ROBOLECTRIC_SDK)
public class ResourceLoaderTest {

  @Mock private ModelLoader<Uri, Object> uriLoader;
  @Mock private DataFetcher<Object> fetcher;
  @Mock private Key key;
  private Options options;

  private ResourceLoader<Object> loader;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
    options = new Options();

    loader =
        new ResourceLoader<>(ApplicationProvider.getApplicationContext().getResources(), uriLoader);
  }

  @Test
  public void testCanHandleId() {
    int id = android.R.drawable.star_off;
    Uri contentUri = Uri.parse("android.resource://android/" + String.valueOf(id));
    when(uriLoader.buildLoadData(eq(contentUri), anyInt(), anyInt(), any(Options.class)))
        .thenReturn(new ModelLoader.LoadData<>(key, fetcher));

    assertTrue(loader.handles(id));
    assertEquals(
        fetcher,
        Preconditions.checkNotNull(loader.buildLoadData(id, 100, 100, new Options())).fetcher);
  }

  @Test
  public void testDoesNotThrowOnInvalidOrMissingId() {
    assertThat(loader.buildLoadData(1234, 0, 0, options)).isNull();
    verify(uriLoader, never())
        .buildLoadData(any(Uri.class), anyInt(), anyInt(), any(Options.class));
  }
}