Back to Repositories

Testing Base Configuration Framework in AndroidUtilCode

This base test suite establishes foundational testing infrastructure for the AndroidUtilCode utility library. It implements Robolectric test runner configuration and provides core setup for bus utils, thread management, and application context initialization.

Test Coverage Overview

The test coverage focuses on core initialization and configuration components essential for the AndroidUtilCode library testing framework.

Key areas include:
  • Bus utility message handling verification
  • Thread execution management
  • Application context initialization
  • Shadow logging configuration

Implementation Analysis

The testing approach utilizes Robolectric’s testing framework for Android environment simulation without requiring an emulator or physical device. The implementation leverages constructor-based setup for global configurations and employs annotation-driven test execution with @RunWith and @Config decorators.

Key patterns include:
  • Custom thread executor implementation
  • Bus message routing configuration
  • Shadow logging stream redirection

Technical Details

Testing tools and configuration:
  • Robolectric TestRunner for Android environment simulation
  • JUnit 4 testing framework
  • ShadowLog for logging capture and verification
  • Custom Executor implementation for synchronous execution
  • RuntimeEnvironment for application context provision

Best Practices Demonstrated

The test suite exemplifies several testing best practices for Android utility testing. It demonstrates proper test isolation through custom thread execution, centralized test configuration, and appropriate use of testing annotations.

Notable practices include:
  • Centralized test configuration using base class
  • Proper test runner configuration
  • Shadow class utilization for system component mocking
  • Clean separation of testing concerns

blankj/androidutilcode

lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java

            
package com.blankj.utilcode.util;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLog;

import java.util.concurrent.Executor;

import androidx.annotation.NonNull;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2018/08/03
 *     desc  :
 * </pre>
 */
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, shadows = {ShadowLog.class})
public class BaseTest {

    @BusUtils.Bus(tag = "base")
    public void noParamFun(int i) {
        System.out.println("base" + i);
    }

    public BaseTest() {
        ShadowLog.stream = System.out;
        ThreadUtils.setDeliver(new Executor() {
            @Override
            public void execute(@NonNull Runnable command) {
                command.run();
            }
        });
        Utils.init(RuntimeEnvironment.application);
    }

    @Test
    public void test() throws Exception {
    }
}