Android 机械分子3与织物碰撞

Android 机械分子3与织物碰撞,android,unit-testing,robolectric,robolectric-gradle-plugin,crashlytics-android,Android,Unit Testing,Robolectric,Robolectric Gradle Plugin,Crashlytics Android,我正在尝试阴影级碰撞/织物,以便机器人电气3测试不会失败。到目前为止,我得到的是: 为结构添加阴影类的自定义测试运行程序: public class TestRunner extends RobolectricGradleTestRunner { public TestRunner(Class<?> klass) throws InitializationError { super(klass); } @Override protec

我正在尝试阴影级碰撞/织物,以便机器人电气3测试不会失败。到目前为止,我得到的是:

为结构添加阴影类的自定义测试运行程序:

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();
    }
}
@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);
    }
}
以下是在调试中通过的测试(因为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支持部门。我被告知“不支持机器人分子”

从我所看到的,我只需要让shadow类的东西工作,然后Crashlytics将被跟踪,而不是初始化


非常感谢您的想法/帮助

这是我通常的建议,如何针对不可测试的内容编写测试

将您的结构初始化提取到受保护的方法:

public class <MyApplicationName> {

public void onCreate() {
   initFabric();
}

@VisibileForTesting
void initFabric() {
....
}
}
公共类{
public void onCreate(){
initFabric();
}
@可视变形
void initFabric(){
....
}
}
在测试源中创建
Test
类(相同的包和覆盖Fabric初始化:

public class Test<MyApplicationName> {
void initFabric() {
//nothing to do
}
}
公共类测试{
void initFabric(){
//无事可做
}
}
在任何需要使用Fabric的地方,都可以在测试中使用DI(依赖项注入)模拟Fabric。更重要的是,我建议您创建分析/崩溃/分发类,并隐藏整个应用程序的Fabric使用情况

最后,您留下了包装/隐藏结构的类。在这里,您可以编写自定义阴影,监视真实对象或使其未经测试。并且您已经尝试编写自定义阴影,但没有成功,而且,这里也不允许进行监视


愉快的编码!

builder.addInstrumentedClass(ShadowFabric.class.getName())尝试Fabric.class而不是ShadowFabric.class;