2015-10-11 3 views
4

Я хотел реализовать собственный класс Application Shadow для переопределения метода getInstance(). Я использую Robolectric 3.0 и создали MyRobolectricTestRunner класс, перекрывая createClassLoaderConfig() метод, как это:Robolectric custom TestRunner не работает при запуске с Gradle

public class MyRobolectricTestRunner extends RobolectricTestRunner { 

    public MyRobolectricTestRunner(Class<?> testClass) throws InitializationError { 
     super(testClass); 
    } 

    @Override 
    public InstrumentationConfiguration createClassLoaderConfig() { 
     InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); 
     builder.addInstrumentedClass(App.class.getName()); 
     return builder.build(); 
    } 
} 

Класс ShadowApp выглядит следующим образом:

@Implements(App.class) 
public class ShadowApp{ 
    @RealObject private static App instance; 

    public static void setAppInstance(App app){ 
     instance = app; 
    } 

    @Implementation 
    public static App getInstance(){ 
     return instance; 
    } 
} 

И тест, который использует бегун аннотированный как это:

@RunWith(MyRobolectricTestRunner.class) 
@Config(manifest=Config.NONE, shadows = {ShadowApp.class}, constants = BuildConfig.class, sdk = 21) 
public class SomeShadowTest { 

Теперь проблема в том, что при запуске теста вручную (нажать «выполнить ...» для этого одного тестового только класса), он проходит Wi Проблема, но когда я использую задачу Gradle «testDebug», тест терпит неудачу, как если бы класс Shadow не использовался вообще :(

Я попытался изменить родительский класс Runner на RobolectricGradleTestRunner, но оказался в тупик, когда он заставил меня сделать класс ShadowApp, расширить класс ShadowApplication, у которого также есть метод getInstance() :(

Любые советы о том, как решить эту проблему?

+1

Есть ли что-нибудь в журналах, которые могли бы помочь? Любые ошибки, предупреждения? Вы пытались запустить с --info или --debug для более подробного вывода? Кроме того, если вы попытаетесь запустить весь пакет из AS, а не только этот тест, он также работает нормально? –

ответ

0

Я предлагаю вам не создавать тень для приложения, а вместо этого использовать класс TestApplication, который Robolectric использует в качестве тестового варианта класса приложения.

Для этого вам просто нужно создать класс, который расширяет ваш класс приложения и имеет имя Test и помещается в корень вашего проекта - пакет класса, такой же, как имя пакета проекта.

пример ниже:

Предположим, что вы упаковали имя com.example.robolectric

// src/main/java/com/example/robolectric 
public class YourAplication extends Application { 
    ... 
} 

// src/test/java/com/example/robolectric 
/** 
* Robolectric uses class with name Test<ApplicationClassName> as test variant of the application 
* class. We use test application for API class injection so we need test version of this class. 
*/ 
public class TestYourAplication extends YourAplication { 
    ... 
}