package com.github.florent37.rxandroidorm.sample; import android.os.Build; import org.junit.runners.model.InitializationError; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import org.robolectric.internal.bytecode.InstrumentationConfiguration; import org.robolectric.internal.bytecode.ShadowMap; import org.robolectric.manifest.AndroidManifest; import java.io.File; import java.util.Properties; public class CustomRobolectricTestRunner extends RobolectricTestRunner { public static final String PATH_ASSET = "../../../../assets/" + BuildConfig.FLAVOR + "/" + BuildConfig.BUILD_TYPE; public static final String PATH_RESOURCE = "../../../../res/merged/" + BuildConfig.FLAVOR + "/" + BuildConfig.BUILD_TYPE; public static final String PATH_MANIFEST = "build/intermediates/manifests/full/" + BuildConfig.FLAVOR + "/" + BuildConfig.BUILD_TYPE + "/AndroidManifest.xml"; public static final String CONFIG_MANIFEST = "manifest"; public static final String CONFIG_ASSET_DIR = "assetDir"; public static final String CONFIG_RESOURCE_DIR = "resourceDir"; public static final String CONFIG_PACKAGE_NAME = "packageName"; public static final String CONFIG_SDK = "sdk"; public static final String PACKAGE_NAME = "net.ilius.android.resources"; public static final String PATH_PREFIX = "app/"; public CustomRobolectricTestRunner(Class<?> testClass) throws InitializationError { super(testClass); } @Override protected AndroidManifest getAppManifest(Config config) { String path = PATH_MANIFEST; // android studio has a different execution root for tests than pure gradle // so we avoid here manual effort to get them running inside android studio if (!new File(path).exists()) { path = PATH_PREFIX + path; } config = overwriteConfig(config, CONFIG_MANIFEST, path); config = overwriteConfig(config, CONFIG_ASSET_DIR, PATH_ASSET); config = overwriteConfig(config, CONFIG_RESOURCE_DIR, PATH_RESOURCE); config = overwriteConfig(config, CONFIG_PACKAGE_NAME, PACKAGE_NAME); return super.getAppManifest(config); } @Override protected int pickSdkVersion(Config config, AndroidManifest manifest) { config = overwriteConfig(config, CONFIG_SDK, String.valueOf(Build.VERSION_CODES.JELLY_BEAN)); return super.pickSdkVersion(config, manifest); } @Override public InstrumentationConfiguration createClassLoaderConfig() { InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); return builder.build(); } protected Config.Implementation overwriteConfig(Config config, String key, String value) { Properties properties = new Properties(); properties.setProperty(key, value); return new Config.Implementation(config, Config.Implementation.fromProperties(properties)); } }