4

После обновления до AppCompat 21 многие наши тесты Robolectric терпят неудачу. Похоже, что есть проблема с панелью инструментов и AppCompatDelegateRobolectric 3.0 не работает с AppCompat 21+

Я пытался как с поддержкой-v4/AppCompat 22.2.1 и версий, используемых в официальном образце для AppCompat:

https://github.com/robolectric/robolectric-samples/tree/master/android-appcompat-v7

Android Studio 1.3 RC4, Android Gradle Plugin 1.2.3 

    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    minSdkVersion 10 
    targetSdkVersion 21 

    compile 'com.android.support:support-v4:21.0.0' 
    compile 'com.android.support:appcompat-v7:21.0.0' 

    testCompile "org.robolectric:robolectric:3.0" 
    testCompile 'org.robolectric:shadows-support-v4:3.0' 

Тестовые Примеры

@Config(constants = BuildConfig.class) 
    @RunWith(RobolectricGradleTestRunner.class) 
    public class ActivateAccountActivityTest { 

     @Test 
     public void shouldRunActivateAccountActivity() throws Exception { 
      // Given 
      ActivateAccountActivity activateAccountActivity = 
        Robolectric.buildActivity(ActivateAccountActivity.class).create().start().get(); 

      // Then 
      assertNotNull(activateAccountActivity.getFragment(ActivateAccountFragment.class)); 
     } 
    } 

тесты завершатся неудачно со следующей трассировки стека:

android.view.InflateException: XML file build/intermediates/res/app/debug/layout/abc_screen_toolbar.xml line #-1 (sorry, not yet implemented): Error inflating class android.support.v7.widget.Toolbar 
     at android.view.LayoutInflater.createView(LayoutInflater.java:633) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:299) 
     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246) 
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106) 
     at com.foo.myapp.Activities.ActivateAccountActivity.onCreate(ActivateAccountActivity.java:19) 
     at android.app.Activity.performCreate(Activity.java:5933) 
     at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:195) 
     at org.robolectric.util.ActivityController$1.run(ActivityController.java:122) 
     at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:304) 
     at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:45) 
     at org.robolectric.util.ActivityController.create(ActivityController.java:118) 
     at org.robolectric.util.ActivityController.create(ActivityController.java:129) 
     at com.foo.myapp.Activities.ActivateAccountActivityTest.shouldRunActivateAccountActivity(ActivateAccountActivityTest.java:40) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
     at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
     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.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
     at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
     at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64) 
     at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
     at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
     at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
     at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
     at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
     at org.gradle.messaging.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:360) 
     at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) 
     at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:744) 
    Caused by: java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
     at android.view.LayoutInflater.$$robo$$createView(LayoutInflater.java:607) 
     at android.view.LayoutInflater.createView(LayoutInflater.java) 
     at android.view.LayoutInflater.$$robo$$createViewFromTag(LayoutInflater.java:743) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java) 
     at android.view.LayoutInflater.$$robo$$rInflate(LayoutInflater.java:806) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java) 
     at android.view.LayoutInflater.$$robo$$rInflate(LayoutInflater.java:809) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java) 
     at android.view.LayoutInflater.$$robo$$inflate(LayoutInflater.java:504) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java) 
     at android.view.LayoutInflater.$$robo$$inflate(LayoutInflater.java:414) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java) 
     at android.view.LayoutInflater.$$robo$$inflate(LayoutInflater.java:365) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java) 
     at android.support.v7.app.AppCompatDelegateImplV7.$$robo$$ensureSubDecor(AppCompatDelegateImplV7.java:299) 
     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java) 
     at android.support.v7.app.AppCompatDelegateImplV7.$$robo$$setContentView(AppCompatDelegateImplV7.java:246) 
     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java) 
     at android.support.v7.app.AppCompatActivity.$$robo$$setContentView(AppCompatActivity.java:106) 
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java) 
     at com.foo.myapp.Activities.ActivateAccountActivity.onCreate(ActivateAccountActivity.java:19) 
     at android.app.Activity.$$robo$$performCreate(Activity.java:5933) 
     at android.app.Activity.performCreate(Activity.java) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:195) 
     at org.robolectric.util.ActivityController$1.run(ActivityController.java:122) 
     at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:304) 
     at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:45) 
     at org.robolectric.util.ActivityController.create(ActivityController.java:118) 
     at org.robolectric.util.ActivityController.create(ActivityController.java:129) 
     at com.foo.myapp.Activities.ActivateAccountActivityTest.shouldRunActivateAccountActivity(ActivateAccountActivityTest.java:40) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
     at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
     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.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
     at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
     at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64) 
     at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
     at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
     at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
     at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
     at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     ... 8 more 
    Caused by: java.lang.NoSuchMethodError: android.support.v4.content.ContextCompat.getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable; 
     at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:173) 
     at android.support.v7.internal.widget.TintManager.getDrawable(TintManager.java:166) 
     at android.support.v7.internal.widget.TintTypedArray.getDrawable(TintTypedArray.java:62) 
     at android.support.v7.widget.Toolbar.__constructor__(Toolbar.java:249) 
     at android.support.v7.widget.Toolbar.<init>(Toolbar.java) 
     at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
     at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:299) 
     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:246) 
     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106) 
     at com.foo.myapp.Activities.ActivateAccountActivity.onCreate(ActivateAccountActivity.java:19) 
     at android.app.Activity.performCreate(Activity.java:5933) 
     at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:195) 
     at org.robolectric.util.ActivityController$1.run(ActivityController.java:122) 
     at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:304) 
     at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:45) 
     at org.robolectric.util.ActivityController.create(ActivityController.java:118) 
     at org.robolectric.util.ActivityController.create(ActivityController.java:129) 
     at com.foo.myapp.Activities.ActivateAccountActivityTest.shouldRunActivateAccountActivity(ActivateAccountActivityTest.java:40) 
     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
     at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
     at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
     at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:251) 
     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.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.runTestClass(JUnitTestClassExecuter.java:86) 
     at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecuter.execute(JUnitTestClassExecuter.java:49) 
     at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor.processTestClass(JUnitTestClassProcessor.java:64) 
     at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:50) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35) 
     at org.gradle.messaging.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) 
     at org.gradle.messaging.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32) 
     at org.gradle.messaging.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93) 
     at com.sun.proxy.$Proxy2.processTestClass(Unknown Source) 
     at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:106) 
     ... 8 more 
+2

У нас нет этой проблемы. Мы используем AppCompat 22.2.0 и Robolectric 3.0. Какой бегун вы используете? Можете ли вы поделиться примером своего теста? –

+0

Тестовый образец добавлен в вопрос. Мы используем RobolectricGradleTestRunner. Используете ли вы AppCompatActivity/ActionBarActivity? Каков ваш minSDK? –

+2

Мы используем AppCompatActivity, наш минимальный sdk равен 17. Также мы указываем 'sdk = 21' в разделе' @ Config' теста. Я не знаю, что будет по умолчанию sdk, если вы его не укажете. Вероятно, 16 или 18 –

ответ

1

Эта проблема была вызвана библиотекой, которая зависит от поддержки-4v: 19. Добавление следующих строк в файле сборки решен вопрос

testCompile('com.example.foo') { 
     exclude group: 'com.android.support', module: 'support-v4' 
    } 
2

У меня очень похожий вопрос и мой вопрос был установлен после того, как я удаляю testCompile»(„com.squareup: фест-андроид: 1.0.8“) " из моего build.gradle.

Я нашел эту информацию из Robolectric migration document и извлечен ниже. Надеюсь, поможет.

НЕ ИСПОЛЬЗУЙТЕ com.squareup: fest-android: 1.0.8. Если у вас есть это в вашем testCompile, обязательно удалите его. Существует конфликт между ним и Robolectric, который вызывает все модульные тесты, связанные с фрагментами/действиями, с с ошибкой NoSuchMethodError. Если вам нужно использовать com.squareup: fest-android: 1.0.8, то удалите из него поддержку-v4: testCompile ('com.squareup: fest-android: 1.0.8') { исключить модуль: 'поддержка -v4 '}