1

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 はシャドウされ、初期化されません。

アイデア/ヘルプをいただければ幸いです。

4

1 に答える 1