CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-robolectric--robolectric

The industry-standard unit testing framework for Android that enables running tests in a simulated Android environment inside a JVM without requiring an emulator or device.

Pending
Overview
Eval results
Files

test-runner.mddocs/

Test Runner and Configuration

Core test execution framework providing JUnit integration and comprehensive configuration options for controlling Robolectric's Android simulation behavior.

Capabilities

RobolectricTestRunner

JUnit test runner that loads and runs tests in a sandboxed Android environment, providing the foundation for all Robolectric tests.

/**
 * Loads and runs a test in a SandboxClassLoader to provide Android runtime simulation.
 * Use as @RunWith(RobolectricTestRunner.class) on test classes.
 */
public class RobolectricTestRunner extends SandboxTestRunner {
    // Constructor creates sandboxed test environment
    public RobolectricTestRunner(Class<?> testClass) throws InitializationError;
}

Usage Example:

@RunWith(RobolectricTestRunner.class)
public class MyAndroidTest {
    @Test
    public void testSomething() {
        // Test code runs in Android simulation
    }
}

ParameterizedRobolectricTestRunner

Parameterized test runner for running the same test across multiple configurations or data sets.

/**
 * Parameterized test runner extending RobolectricTestRunner.
 * Allows running tests with different parameters or configurations.
 */
public class ParameterizedRobolectricTestRunner extends RobolectricTestRunner {
    public ParameterizedRobolectricTestRunner(Class<?> testClass) throws InitializationError;
}

@Config Annotation

Primary configuration annotation for controlling test behavior at the class or method level.

/**
 * Configuration settings that can be used on a per-class or per-test basis.
 * Controls Android simulation parameters and test environment setup.
 */
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Config {
    
    /** Android SDK levels to emulate. Will also be set as Build.VERSION.SDK_INT */
    int[] sdk() default {};
    
    /** Minimum Android SDK level for multi-version tests */
    int minSdk() default -1;
    
    /** Maximum Android SDK level for multi-version tests */
    int maxSdk() default -1;
    
    /** Font scale factor (default 1.0f). Users can adjust this in Android U+ */
    float fontScale() default 1.0f;
    
    /** 
     * @deprecated Android manifest file path
     * Use build system integration instead
     */
    @Deprecated
    String manifest() default "--default";
    
    /** Application class to use, overrides AndroidManifest.xml setting */
    Class<? extends Application> application() default DefaultApplication.class;
    
    /** 
     * @deprecated Java package name for R.class
     * Override applicationId in build system instead
     */
    @Deprecated
    String packageName() default "";
    
    /** 
     * Device configuration qualifiers like "fr-normal-port-hdpi"
     * If prefixed with '+', overlays on broader-scoped qualifiers
     */
    String qualifiers() default "";
    
    /** 
     * @deprecated Resource directory path
     * Use build system integration instead
     */
    @Deprecated
    String resourceDir() default "res";
    
    /** 
     * @deprecated Asset directory path  
     * Use build system integration instead
     */
    @Deprecated
    String assetDir() default "assets";
    
    /** Additional shadow classes to enable */
    Class<?>[] shadows() default {};
    
    /** Additional instrumented packages */
    String[] instrumentedPackages() default {};
    
    /** 
     * @deprecated Android library dependencies
     * Use build system integration instead
     */
    @Deprecated
    String[] libraries() default {};
}

Configuration Constants:

public @interface Config {
    // Special values
    String NONE = "--none";
    String DEFAULT_VALUE_STRING = "--default";
    int DEFAULT_VALUE_INT = -1;
    
    // SDK constants
    int ALL_SDKS = -2;      // Run on all supported SDKs
    int TARGET_SDK = -3;    // Use target SDK
    int OLDEST_SDK = -4;    // Use oldest supported SDK  
    int NEWEST_SDK = -5;    // Use newest supported SDK
    
    // Default configuration values
    String DEFAULT_MANIFEST_NAME = "AndroidManifest.xml";
    String DEFAULT_RES_FOLDER = "res";
    String DEFAULT_ASSET_FOLDER = "assets";
    Class<? extends Application> DEFAULT_APPLICATION = DefaultApplication.class;
}

Usage Examples:

// Single SDK version
@Config(sdk = 28)
public class MyTest { }

// Multiple SDK versions
@Config(sdk = {28, 29, 30})
public class CrossVersionTest { }

// SDK range
@Config(minSdk = 21, maxSdk = 30)
public class RangeTest { }

// Device configuration
@Config(qualifiers = "xlarge-land-mdpi")
public class TabletTest { }

// Custom application
@Config(application = MyCustomApplication.class)
public class CustomAppTest { }

// Additional shadows
@Config(shadows = {MyCustomShadow.class})
public class CustomShadowTest { }

// Method-level override
@Config(sdk = 28)
public class MyTest {
    @Config(sdk = 30)  // Overrides class-level config
    @Test
    public void newSdkTest() { }
}

Config.Builder

Programmatic configuration builder for creating Config instances dynamically.

/**
 * Builder for creating Config instances programmatically.
 * Useful for dynamic configuration or test parameterization.
 */
public static class Builder {
    public Builder();
    public Builder(Config config);
    
    public Builder setSdk(int... sdk);
    public Builder setMinSdk(int minSdk);
    public Builder setMaxSdk(int maxSdk);
    public Builder setManifest(String manifest);
    public Builder setQualifiers(String qualifiers);
    public Builder setFontScale(float fontScale);
    
    /** @deprecated Use build system integration */
    @Deprecated
    public Builder setPackageName(String packageName);
    
    /** @deprecated Use build system integration */
    @Deprecated  
    public Builder setResourceDir(String resourceDir);
    
    /** @deprecated Use build system integration */
    @Deprecated
    public Builder setAssetDir(String assetDir);
    
    public Builder setShadows(Class<?>... shadows);
    public Builder setInstrumentedPackages(String... instrumentedPackages);
    public Builder setApplication(Class<? extends Application> application);
    
    /** @deprecated Use build system integration */
    @Deprecated
    public Builder setLibraries(String... libraries);
    
    public Builder overlay(Config overlayConfig);
    public Implementation build();
    
    public static Builder defaults();
    public static boolean isDefaultApplication(Class<? extends Application> clazz);
}

Config.Implementation

Concrete implementation of the Config annotation interface.

/**
 * Concrete implementation of Config annotation.
 * Can be created from Properties or programmatically.
 */
public static class Implementation implements Config {
    public Implementation(/* parameters for all config values */);
    
    public static Config fromProperties(Properties properties);
    
    // Implements all Config interface methods
    public int[] sdk();
    public int minSdk();
    public int maxSdk();
    public String manifest();
    public float fontScale();
    public Class<? extends Application> application();
    public String qualifiers();
    public String packageName();
    public String resourceDir();
    public String assetDir();
    public Class<?>[] shadows();
    public String[] instrumentedPackages();
    public String[] libraries();
}

Usage Example:

// Create from properties
Properties props = new Properties();
props.setProperty("sdk", "28,29,30");
props.setProperty("qualifiers", "xlarge-land");
Config config = Config.Implementation.fromProperties(props);

// Create with builder
Config config = new Config.Builder()
    .setSdk(28, 29, 30)
    .setQualifiers("xlarge-land-mdpi")
    .setApplication(MyApplication.class)
    .build();

Configuration Hierarchy

Configuration follows a hierarchy where more specific configurations override broader ones:

  1. Global - System properties and robolectric.properties files
  2. Package - package-info.java annotations
  3. Class - Class-level @Config annotations
  4. Method - Method-level @Config annotations

Method-level configurations have the highest precedence and will override all others.

Robolectric Properties

Configure Robolectric globally using system properties or robolectric.properties files:

# robolectric.properties
sdk=21,28,29,30
minSdk=21
maxSdk=30
qualifiers=normal-hdpi

System properties use the robolectric. prefix:

-Drobolectric.sdk=28
-Drobolectric.qualifiers=xlarge-land-mdpi

Install with Tessl CLI

npx tessl i tessl/maven-org-robolectric--robolectric

docs

component-lifecycle.md

index.md

looper-threading.md

runtime-environment.md

shadow-system.md

test-runner.md

tile.json