【问题标题】:NoClassDefFoundError from Robolectric with ADT23 and Android 15来自带有 ADT23 和 Android 15 的 Robolectric 的 NoClassDefFoundError
【发布时间】:2014-09-05 16:20:26
【问题描述】:

我有一个 Android 项目,我正在尝试使用 JUnit、Mockito 和 Robolectric 设置单元测试。我正在使用 ADT23(这是值得一提的,因为我不得不手动下载 eclipse JDT,根据这篇文章:https://stackoverflow.com/a/25519274/3519951)。以上所有内容均在 Windows 7 上运行。

运行测试时,我在 Android 视图上遇到 NoClassDefFoundError 错误。

是的,Android 已导入(平台 android-15),以及我的 Android 项目...这是我的库:​​

运行配置:

  • 在所选项目中运行所有测试
  • 测试运行器是 JUnit 4
  • 使用 Eclipse JUnit 启动器(和不 Android JUnit 测试启动器)
  • 在参数选项卡中,我将工作目录设置为 ${workspace_loc:ApplicationLauncherActivity},它代表我正在测试的项目。

这是完整的堆栈跟踪:

    java.lang.NoClassDefFoundError: android/view/View
    at com.xtremelabs.robolectric.RobolectricTestRunner.createResourceLoader(RobolectricTestRunner.java:502)
    at com.xtremelabs.robolectric.RobolectricTestRunner.setupApplicationState(RobolectricTestRunner.java:357)
    at com.xtremelabs.robolectric.RobolectricTestRunner.internalBeforeTest(RobolectricTestRunner.java:307)
    at com.xtremelabs.robolectric.RobolectricTestRunner.methodBlock(RobolectricTestRunner.java:285)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: caught an exception while obtaining a class file for android.view.View
    at javassist.Loader.findClass(Loader.java:359)
    at com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.findClass(RobolectricClassLoader.java:82)
    at javassist.Loader.loadClass(Loader.java:311)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.xtremelabs.robolectric.bytecode.RobolectricClassLoader.loadClass(RobolectricClassLoader.java:59)
    ... 18 more
Caused by: java.lang.RuntimeException: problem instrumenting public void android.view.View.setContentDescription(java.lang.CharSequence)
    at com.xtremelabs.robolectric.bytecode.AndroidTranslator.fixMethod(AndroidTranslator.java:324)
    at com.xtremelabs.robolectric.bytecode.AndroidTranslator.fixMethods(AndroidTranslator.java:245)
    at com.xtremelabs.robolectric.bytecode.AndroidTranslator.onLoad(AndroidTranslator.java:103)
    at javassist.Loader.findClass(Loader.java:340)
    ... 22 more
Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 15
    at javassist.CtClassType.getClassFile2(CtClassType.java:203)
    at javassist.CtClassType.subtypeOf(CtClassType.java:303)
    at javassist.compiler.MemberResolver.compareSignature(MemberResolver.java:247)
    at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:119)
    at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:96)
    at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:704)
    at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681)
    at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156)
    at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45)
    at javassist.compiler.TypeChecker.atArrayInit(TypeChecker.java:185)
    at javassist.compiler.ast.ArrayInit.accept(ArrayInit.java:28)
    at javassist.compiler.TypeChecker.atNewArrayExpr(TypeChecker.java:161)
    at javassist.compiler.TypeChecker.atNewExpr(TypeChecker.java:143)
    at javassist.compiler.ast.NewExpr.accept(NewExpr.java:72)
    at javassist.compiler.JvstTypeChecker.atMethodArgs(JvstTypeChecker.java:220)
    at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:702)
    at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:681)
    at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:156)
    at javassist.compiler.ast.CallExpr.accept(CallExpr.java:45)
    at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:241)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:329)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:350)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
    at javassist.compiler.CodeGen.atIfStmnt(CodeGen.java:390)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:354)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
    at javassist.compiler.CodeGen.atStmnt(CodeGen.java:350)
    at javassist.compiler.ast.Stmnt.accept(Stmnt.java:49)
    at javassist.compiler.Javac.compileStmnt(Javac.java:568)
    at javassist.CtBehavior.insertBefore(CtBehavior.java:705)
    at javassist.CtBehavior.insertBefore(CtBehavior.java:685)
    at com.xtremelabs.robolectric.bytecode.AndroidTranslator.fixMethod(AndroidTranslator.java:321)
    ... 25 more
Caused by: java.io.IOException: invalid constant type: 15
    at javassist.bytecode.ConstPool.readOne(ConstPool.java:1090)
    at javassist.bytecode.ConstPool.read(ConstPool.java:1033)
    at javassist.bytecode.ConstPool.<init>(ConstPool.java:149)
    at javassist.bytecode.ClassFile.read(ClassFile.java:764)
    at javassist.bytecode.ClassFile.<init>(ClassFile.java:108)
    at javassist.CtClassType.getClassFile2(CtClassType.java:190)
    ... 57 more

一个大学有类似的设置,目前正在运行,但我们找不到任何显着差异,除了他运行 ADT 22.3。任何帮助表示赞赏,非常感谢!

编辑: 我想你们中的一些人可能想看一个测试课,这里有一个。您会看到其中甚至没有对 Android 对象的引用,因此该错误确实与 Robolectric 的初始化有关...

import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import com.xtremelabs.robolectric.RobolectricTestRunner;

@RunWith(RobolectricTestRunner.class)
public class BogusTest
{

    @Before
    public void setUp() throws Exception
    {
    }

    @Test
    public void theTest()
    {
        assertTrue(true);
    }
}

【问题讨论】:

  • 不确定是否相关,但有什么理由使用这么旧版本的 Robolectric?
  • 确实是一个好问题:在我同事的设置中,使用 ADT22.3,较新版本的 Robolectric 将无法工作。我们尝试了带有 ADT 23 的 Robolectric 的各种版本(包括最新版本),但似乎都不起作用。

标签: android eclipse unit-testing adt robolectric


【解决方案1】:

问题解决了。

我们决定停止使用 ADT,并使用我们需要的插件(Android DDMS、Android 开发工具、Android 原生开发工具)安装 Eclipse Luna。它并不比安装 ADT 复杂多少,现在测试运行良好。这个问题将仍然无法解释......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多