???????????????RobolectricGradleTestRunner????????
???????????ж???? application ??? Robolectric ?????????
public class IntegrationRobolectricTestRunner extends RobolectricGradleTestRunner {
// This value should be changed as soon as Robolectric will support newer api.
private static final int SDK_EMULATE_LEVEL = 21;
public IntegrationRobolectricTestRunner(@NonNull Class<?> clazz) throws Exception {
super(clazz);
}
@Override
public Config getConfig(@NonNull Method method) {
final Config defaultConfig = super.getConfig(method);
return new Config.Implementation(
new int[]{SDK_EMULATE_LEVEL}??
defaultConfig.manifest()??
defaultConfig.qualifiers()??
defaultConfig.packageName()??
defaultConfig.resourceDir()??
defaultConfig.assetDir()??
defaultConfig.shadows()??
MyIntegrationTestApp.class?? // Here is the trick?? we change application class to one with mocks.
defaultConfig.libraries()??
defaultConfig.constants() == Void.class ? BuildConfig.class : defaultConfig.constants()
);
}
}
????????? Instrumentation ????????? Dagger 2 ????????????
????Google ?????????????? flavors?????????????????????? flavors ????????????????????????????????? Gradle ???????????????????????????????????? flavors??
????????·???? Roboletric ????????——??????Application???????????????????? Instrumentation ?????
?????????????????????????? Instrumentation ???????????????????????build.gradle?С?
public class CustomInstrumentationTestRunner extends AndroidJUnitRunner {
@Override
@NonNull
public Application newApplication(@NonNull ClassLoader cl??
@NonNull String className??
@NonNull Context context)
throws InstantiationException??
IllegalAccessException??
ClassNotFoundException {
return Instrumentation.newApplication(CustomApp.class?? context);
}
}
??????????????build.gradle?У?
android {
defaultConfig {
testInstrumentationRunner 'a.b.c.CustomInstrumentationTestRunner'
}
}
??????????????????????????μ? #qualitymatters app?У?????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????? flavors??