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.
—
Core test execution framework providing JUnit integration and comprehensive configuration options for controlling Robolectric's Android simulation behavior.
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
}
}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;
}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() { }
}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);
}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 follows a hierarchy where more specific configurations override broader ones:
Method-level configurations have the highest precedence and will override all others.
Configure Robolectric globally using system properties or robolectric.properties files:
# robolectric.properties
sdk=21,28,29,30
minSdk=21
maxSdk=30
qualifiers=normal-hdpiSystem properties use the robolectric. prefix:
-Drobolectric.sdk=28
-Drobolectric.qualifiers=xlarge-land-mdpiInstall with Tessl CLI
npx tessl i tessl/maven-org-robolectric--robolectric