Robolectric 3 个使用 Fabric Crashlytics
Robolectric 3 with Fabric Crashlytics
我正在尝试 ShadowClass Crashlytics/Fabric 以便 Robotlectric 3 测试不会失败。我到目前为止是这样的:
为 Fabric 添加 Shadow class 的自定义测试运行程序:
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();
}
}
织物的影子class:
@Implements(Fabric.class)
public class ShadowFabric {
@Implementation
public static Fabric with(Context context, Kit... kits) {
System.out.println("Shadowing Fabric");
return null;
}
}
我的应用 class 我的应用:
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 支持电子邮件。有人告诉我 'Robolectric is not supported'。
据我所知,我只需要让影子 class 正常工作,然后 Crashlytics 就会被影子而不是初始化。
非常感谢您的想法/帮助!
这是我通常的建议,如何针对不可测试的内容编写测试。
提取你的 Fabric 初始化到受保护的方法:
public class <MyApplicationName> {
public void onCreate() {
initFabric();
}
@VisibileForTesting
void initFabric() {
....
}
}
在测试源中创建 Test<MayApplicationName>
class(相同的包并覆盖 Fabric 初始化:
public class Test<MyApplicationName> {
void initFabric() {
//nothing to do
}
}
在任何需要使用 Fabric 的地方使用 DI(依赖注入)在测试中模拟 Fabric。更重要的是,我建议您创建 Analytics/Crash/Distribution class 并在整个应用程序中隐藏 Fabric 用法。
最后你离开了 class 是 wrap/hide Fabric。您可以在此处编写自定义阴影、监视真实对象或不对其进行测试。而且您已经尝试编写自定义影子但没有成功,此外,间谍不是这里的选项。
编码愉快!
我正在尝试 ShadowClass Crashlytics/Fabric 以便 Robotlectric 3 测试不会失败。我到目前为止是这样的:
为 Fabric 添加 Shadow class 的自定义测试运行程序:
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();
}
}
织物的影子class:
@Implements(Fabric.class)
public class ShadowFabric {
@Implementation
public static Fabric with(Context context, Kit... kits) {
System.out.println("Shadowing Fabric");
return null;
}
}
我的应用 class 我的应用:
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 支持电子邮件。有人告诉我 'Robolectric is not supported'。
据我所知,我只需要让影子 class 正常工作,然后 Crashlytics 就会被影子而不是初始化。
非常感谢您的想法/帮助!
这是我通常的建议,如何针对不可测试的内容编写测试。
提取你的 Fabric 初始化到受保护的方法:
public class <MyApplicationName> {
public void onCreate() {
initFabric();
}
@VisibileForTesting
void initFabric() {
....
}
}
在测试源中创建 Test<MayApplicationName>
class(相同的包并覆盖 Fabric 初始化:
public class Test<MyApplicationName> {
void initFabric() {
//nothing to do
}
}
在任何需要使用 Fabric 的地方使用 DI(依赖注入)在测试中模拟 Fabric。更重要的是,我建议您创建 Analytics/Crash/Distribution class 并在整个应用程序中隐藏 Fabric 用法。
最后你离开了 class 是 wrap/hide Fabric。您可以在此处编写自定义阴影、监视真实对象或不对其进行测试。而且您已经尝试编写自定义影子但没有成功,此外,间谍不是这里的选项。
编码愉快!