2016-03-07 6 views
2

Я унаследовал устаревший проект Android и начал добавлять тестовые примеры Robolectric 3 и JUnit 4. К сожалению, в настоящее время основной класс Application не может быть инициализирован из-за кода спагетти и фреймворков, которые не работают в Robolectric. Я бы хотел заменить класс приложения для тестов. Но Robolectric падает, прежде чем я могу даже обновить переменную RuntimeEnviroment.application. Есть ли способ отключить создание манифеста приложений в Robolectric?Как переопределить приложение Robolectric?

Вот что я пытаюсь сделать:

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21, manifest = Config.NONE) 
public class TestClass { 
    @Before 
    public void setUp() { 
     RuntimeEnvironment.application = new Application(); 
    } 

    @Test 
    public void testFunc() { 
     // some testing goes here 
    } 
} 

Но это не удается из-за Разбираем рамки:

java.lang.RuntimeException 
    at org.robolectric.util.SimpleFuture.run(SimpleFuture.java:61) 
    at org.robolectric.shadows.ShadowAsyncTask$2.run(ShadowAsyncTask.java:96) 
    at org.robolectric.util.Scheduler.runOrQueueRunnable(Scheduler.java:230) 
    at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:85) 
    at org.robolectric.util.Scheduler.post(Scheduler.java:72) 
    at org.robolectric.shadows.ShadowAsyncTask.execute(ShadowAsyncTask.java:93) 
    at android.os.AsyncTask.execute(AsyncTask.java) 
    at com.facebook.internal.Utility.loadAppSettingsAsync(Utility.java:771) 
    at com.facebook.FacebookSdk.sdkInitialize(FacebookSdk.java:167) 
    at com.facebook.FacebookSdk.sdkInitialize(FacebookSdk.java:146) 
    at com.parse.FacebookController$FacebookSdkDelegateImpl.initialize(FacebookController.java:187) 
    at com.parse.FacebookController.initialize(FacebookController.java:70) 
    at com.parse.ParseFacebookUtils.initialize(ParseFacebookUtils.java:108) 
    at com.parse.ParseFacebookUtils.initialize(ParseFacebookUtils.java:92) 
    at MyApplication.initParse(StrongliftsApplication.java:174) 
    at MyApplication.onCreate(StrongliftsApplication.java:112) 
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:140) 
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:433) 
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:240) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188) 
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:152) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runners.Suite.runChild(Suite.java:128) 
    at org.junit.runners.Suite.runChild(Suite.java:27) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

ответ

7

Так случается, что разработчики Robolectric forsaw эту ситуацию и @Config директива позволяет применять переопределения. Также явное переопределение не помогло мне вообще, чтобы его можно было удалить.

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21, application = MyTestApplication.class) 
public class TestClass { 
    @Test 
    public void testFunc() { 
     // some testing goes here 
    } 
} 

Поскольку наше приложение использует одноэлементный шаблон, мне пришлось также инициализировать экземпляр singleton. Я игнорирую всякую инализацию на пурпуре, поскольку она в основном ограничивала рамки. Вот как выглядит мое приложение MyTestApplication:

public class MyTestApplication extends MyApplication { 
    @Override 
    public void onCreate() { 
     MyApplication.instance = this; 
    } 
} 
+1

Вы также можете поделиться классом MyTestApplication? по крайней мере, базовую версию вашего MyTestApplication. – LostPuppy

+1

@LostPuppy конечно, просто добавил точный код, который у нас есть – Ritave

1

Существует более простое решение.

Просто введите класс Test<YouApplicationName> в тестовые источники и ** Robolectric заберет его.

Так что, если имя вашего приложения org.my.package.SuperApplication затем создать класс TestSuperapplication в папке test\java\org\my\package\ и вам не нужно предоставить что-либо в разделе @Config.

+0

Приятно знать, не нашел его в документации, спасибо! Хотя я предпочитаю эксплицитно излагать свое притворное приложение, таким образом, следующий разработчик будет знать, что происходит. Также это позволяет использовать различные приложения для различных тестов. – Ritave

+0

Несомненно. Это ваш код. Я не думаю, что вы будете использовать второе приложение –

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