Robotlectric 3 テストが失敗しないように、Crashlytics/Fabric を ShadowClass しようとしています。私がこれまでに持っているのはこれです:
Fabric の Shadow クラスを追加するカスタム テスト ランナー:
public class TestRunner extends RobolectricGradleTestRunner {
public TestRunner(Class<?> klass) throws InitializationError {
super(klass);
}
@Override
protected ShadowMap createShadowMap() {
return super.createShadowMap()
.newBuilder().addShadowClass(ShadowFabric.class).build();
}
@Override
public InstrumentationConfiguration createClassLoaderConfig() {
InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder();
builder.addInstrumentedClass(ShadowFabric.class.getName());
return builder.build();
}
}
Fabric のシャドウ クラス:
@Implements(Fabric.class)
public class ShadowFabric {
@Implementation
public static Fabric with(Context context, Kit... kits) {
System.out.println("Shadowing Fabric");
return null;
}
}
私のアプリの私のアプリケーションクラス:
public class MyApp extends Application {
@Override
public void onCreate() {
setupCrashlytics();
}
protected void setupCrashlytics() {
Crashlytics crashlyticsKit = new Crashlytics.Builder().core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build();
// Initialize Fabric with the debug-disabled crashlytics.
Fabric.with(this, crashlyticsKit);
}
}
以下は、Debug ではパスする (Crashlytics が無効になっているため) テストですが、ShadowClass が正しく機能していないため、リリース モードでは失敗するテストです。
@RunWith(TestRunner.class)
@Config(constants = BuildConfig.class, sdk=21, packageName="com.my.release.package.name", shadows={ShadowFabric.class})
public class MyTest {
@Test
public void testGreenDAOsave() {
// blah
}
}
テスト中に Crashlytics / Fabric で発生するエラーは次のとおりです。
STANDARD_ERROR
io.fabric.sdk.android.services.concurrency.UnmetDependencyException: com.crashlytics.android.core.CrashlyticsMissingDependencyException:
This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up
install an Android build tool and ask a team member to invite you to this app's organization.
スタック トレースは、MyApp.setupCrashlytics() が呼び出され、Fabric.with() が失敗していることを示しています。
1) はい、アプリは Crashlytics に登録されています。
2) はい、Crashlytics のサポート メールに連絡しました。「Robolectric はサポートされていません」と言われました。
私が見る限り、シャドウ クラスを機能させるだけで、Crashlytics はシャドウされ、初期化されません。
アイデア/ヘルプをいただければ幸いです。