Back to Repositories

Testing Connectivity Monitor Factory Implementation in Glide

This test suite evaluates the DefaultConnectivityMonitorFactory class in Glide, focusing on network state permission handling and monitor instantiation. It verifies the factory’s behavior in creating appropriate connectivity monitors based on Android permissions.

Test Coverage Overview

The test suite provides comprehensive coverage of the DefaultConnectivityMonitorFactory functionality.

Key areas tested include:
  • Permission-based monitor creation logic
  • Default connectivity monitor instantiation
  • Null monitor fallback behavior
The tests specifically verify the factory’s response to both granted and denied network state permissions.

Implementation Analysis

The testing approach utilizes Robolectric for Android environment simulation and JUnit for test structure. The implementation employs shadow objects to mock Android permissions and uses Mockito for creating test doubles.

Key patterns include:
  • Permission state manipulation via shadowOf
  • Mock listener injection
  • Type verification using Truth assertions

Technical Details

Testing tools and configuration:
  • Robolectric TestRunner with SDK configuration
  • JUnit 4 testing framework
  • Google Truth assertion library
  • Mockito mocking framework
  • ApplicationProvider for context access

Best Practices Demonstrated

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

Notable practices include:
  • Proper test isolation using @Before setup
  • Clear test method naming conventions
  • Focused test cases with single responsibilities
  • Effective use of Android testing utilities
  • Proper permission handling verification

bumptech/glide

library/test/src/test/java/com/bumptech/glide/manager/DefaultConnectivityMonitorFactoryTest.java

            
package com.bumptech.glide.manager;

import static com.bumptech.glide.RobolectricConstants.ROBOLECTRIC_SDK;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.robolectric.Shadows.shadowOf;

import android.app.Application;
import androidx.test.core.app.ApplicationProvider;
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 DefaultConnectivityMonitorFactoryTest {
  private ConnectivityMonitorFactory factory;

  @Before
  public void setUp() {
    factory = new DefaultConnectivityMonitorFactory();
  }

  @Test
  public void testReturnsDefaultConnectivityMonitorWhenHasPermission() {
    shadowOf((Application) ApplicationProvider.getApplicationContext())
        .grantPermissions("android.permission.ACCESS_NETWORK_STATE");
    ConnectivityMonitor connectivityMonitor =
        factory.build(
            ApplicationProvider.getApplicationContext(),
            mock(ConnectivityMonitor.ConnectivityListener.class));
    assertThat(connectivityMonitor).isInstanceOf(DefaultConnectivityMonitor.class);
  }

  @Test
  public void testReturnsNullConnectivityMonitorWhenDoesNotHavePermission() {
    ConnectivityMonitor connectivityMonitor =
        factory.build(
            ApplicationProvider.getApplicationContext(),
            mock(ConnectivityMonitor.ConnectivityListener.class));
    assertThat(connectivityMonitor).isInstanceOf(NullConnectivityMonitor.class);
  }
}