1

在使用 gradle 和 Java 7 构建的 android 项目中,将 targetSdkVersion 从 19 更改为 21 时,在运行 robolectric 测试时会引发以下异常:

构建.gradle:

apply plugin: 'com.android.application'
apply plugin: 'robolectric'


android {
compileSdkVersion 21
buildToolsVersion '21.0.2'
defaultConfig {
    minSdkVersion 9
    targetSdkVersion 21
    versionCode 6
    versionName '2.0.0'
}
...

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.0.+'
compile 'org.roboguice:roboguice:2.0'
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
compile 'com.github.rtyley:roboguice-sherlock:1.5'
compile 'org.apache.commons:commons-lang3:3.3.1@jar'
compile 'oauth.signpost:signpost-core:1.2.1.2'
compile 'ch.acra:acra:4.2.3'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.squareup.okhttp:okhttp:2.0.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.0.0'
compile 'com.squareup.okio:okio:1.0.1'
compile 'com.jakewharton:disklrucache:2.0.2'
compile group: 'com.google.guava', name: 'guava', version: '17.0'
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'com.squareup:fest-android:1.0.+'
testCompile 'org.mockito:mockito-all:+'
testCompile 'junit:junit:4.11'
testCompile 'org.robolectric:robolectric:2.3+'
androidTestCompile 'com.squareup:fest-android:1.0.+'
androidTestCompile 'org.mockito:mockito-all:+'
androidTestCompile 'junit:junit:4.11'
androidTestCompile 'org.robolectric:robolectric:2.3+'
}

失败的测试输出:

java.lang.VerifyError: Expecting a stackmap frame at branch target 15
Exception Details:
Location:
android/support/v4/app/FragmentTransitionCompat21$EpicenterView.$$robo$init()V @4: ifnonnull
Reason:
Expected stackmap frame at this location.
Bytecode:
0000000: 2ab4 0034 c700 0b2a 2ab8 0063 b500 34b1
0000010:                                        

at android.support.v4.app.BackStackRecord$TransitionState.__constructor__(BackStackRecord.java:1456)
at android.support.v4.app.BackStackRecord$TransitionState.<init>(BackStackRecord.java:1452)
at android.support.v4.app.BackStackRecord.beginTransition(BackStackRecord.java:1018)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:660)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
at org.robolectric.util.Scheduler.postDelayed(Scheduler.java:37)
at org.robolectric.shadows.ShadowLooper.post(ShadowLooper.java:207)
at org.robolectric.shadows.ShadowHandler.postDelayed(ShadowHandler.java:56)
at org.robolectric.shadows.ShadowHandler.post(ShadowHandler.java:51)
at android.os.Handler.post(Handler.java)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1395)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:636)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:615)
at com.irokodemo.app.application.IrokoTestRunner.startFragment(IrokoTestRunner.java:40)
at com.irokodemo.app.fragment.TvSeasonTabFragmentTest.shouldSetTitle(TvSeasonTabFragmentTest.java:84)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:250)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
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:69)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:48)
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:105)
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:355)
at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)

当 targetSdkVersion 设置为 19 时不会抛出此异常。

问题是什么?

4

1 回答 1

4

将 Robolectric 版本 2.3 更新到 2.4 解决了这个问题。

testCompile 'org.robolectric:robolectric:2.4'

于 2014-11-12T05:26:50.190 回答