1

Я пытаюсь ShadowClass Crashlytics/Fabric, чтобы тесты Robotlectric 3 не терпелись неудачи. То, что я до сих пор это:Robolectric 3 with Fabric Crashlytics

Обычай тест бегун, который добавляет класс 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(); 
    } 
} 

Тень класса для ткани:

@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 отключен на нем), b ут проваливается в режиме выпуска, поскольку 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/ткань во время теста следующие:

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 будет затенена, а не init'd.

Идеи/Помощь была бы очень признательна!

+0

попробуйте Fabric.class вместо ShadowFabric.class на 'builder.addInstrumentedClass (ShadowFabric.class.getName());' – nenick

ответ

3

Это мой обычный совет, как написать тест против чего-то не проверяемого.

Extract вы Ткань инициализации защищаемого метода:

public class <MyApplicationName> { 

public void onCreate() { 
    initFabric(); 
} 

@VisibileForTesting 
void initFabric() { 
.... 
} 
} 

Создать Test<MayApplicationName> класс в источниках испытаний (тот же пакет и преимущественную Ткань инициализации:

public class Test<MyApplicationName> { 
void initFabric() { 
//nothing to do 
} 
} 

Везде, где вам нужно, используя Ткань использование DI (инъекция зависимостей) для издевательства Ткань в испытаниях. Более того, я предлагаю вам создать Google Analytics/Crash/Distribution class и скрыть Fabric использование всего приложения.

И окончательно вы оставили классы, которые обертывают/скрывают Ткань. Здесь вы можете написать пользовательский тень, шпион по реальному объекту или оставить его непроверенным. И вы уже давно пытались написать обычную тень, но шпионаж здесь не вариант.

Счастливое кодирование!

Смежные вопросы