Back to Repositories

Validating Asset URI Loading Workflow in Glide

This test suite validates the AssetUriLoader functionality in Glide, focusing on handling asset URIs and proper fetcher initialization. The tests ensure correct URI parsing and asset management integration within the Glide image loading library.

Test Coverage Overview

The test suite covers essential functionality of AssetUriLoader, focusing on URI handling and fetcher creation.

  • Validates handling of asset URIs with specific format (file:///android_asset/)
  • Tests integration with AssetManager
  • Verifies proper fetcher instantiation and configuration
  • Ensures correct parsing of asset names from URIs

Implementation Analysis

The testing approach utilizes JUnit with Robolectric for Android environment simulation. Mockito is employed for mocking dependencies and verifying interactions.

Key patterns include:
  • Mock injection for AssetFetcherFactory and DataFetcher
  • ApplicationProvider usage for context access
  • URI parsing validation
  • Robolectric test runner configuration

Technical Details

Testing infrastructure includes:

  • JUnit 4 test framework
  • Robolectric for Android runtime simulation
  • Mockito for mocking and verification
  • Custom SDK configuration (ROBOLECTRIC_SDK)
  • ApplicationProvider for Android context
  • Asset URI handling utilities

Best Practices Demonstrated

The test suite exemplifies several testing best practices in Android development.

  • Proper test setup and teardown using @Before
  • Clear separation of concerns with mock objects
  • Explicit test method naming
  • Focused test scenarios with single responsibility
  • Effective use of assertion methods
  • Clean mock initialization and verification

bumptech/glide

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

            
package com.bumptech.glide.load.model;

import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;

import android.content.res.AssetManager;
import android.net.Uri;
import androidx.test.core.app.ApplicationProvider;
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;

@RunWith(RobolectricTestRunner.class)
@Config(sdk = ROBOLECTRIC_SDK)
public class AssetUriLoaderTest {
  private static final int IMAGE_SIDE = 10;

  @Mock private AssetUriLoader.AssetFetcherFactory<Object> factory;
  @Mock private DataFetcher<Object> fetcher;
  private AssetUriLoader<Object> loader;

  @Before
  public void setUp() {
    MockitoAnnotations.initMocks(this);
    loader = new AssetUriLoader<>(ApplicationProvider.getApplicationContext().getAssets(), factory);
  }

  @Test
  public void testHandlesAssetUris() {
    Uri assetUri = Uri.parse("file:///android_asset/assetName");
    when(factory.buildFetcher(any(AssetManager.class), eq("assetName"))).thenReturn(fetcher);
    assertTrue(loader.handles(assetUri));
    assertEquals(
        fetcher,
        Preconditions.checkNotNull(
                loader.buildLoadData(assetUri, IMAGE_SIDE, IMAGE_SIDE, new Options()))
            .fetcher);
  }
}