使用ADT23和Android 15的Robolectric的NoClassDefFoundError

使用ADT23和Android 15的Robolectric的NoClassDefFoundError,android,eclipse,unit-testing,adt,robolectric,Android,Eclipse,Unit Testing,Adt,Robolectric,我有一个Android项目,我正在尝试使用JUnit、Mockito和Robolectric为其设置单元测试。我使用的是ADT23(这一点值得一提,因为我不得不手动下载EclipseJDT,正如本文所述:)。以上所有操作都在Windows7上运行 在运行测试时,我在Android视图上遇到一个NoClassDefFoundError错误 是的,Android已经导入(平台Android-15),还有我的Android项目。。。这是我的图书馆: 运行配置: 在所选项目中运行所有测试 测试运行程

我有一个Android项目,我正在尝试使用JUnit、Mockito和Robolectric为其设置单元测试。我使用的是ADT23(这一点值得一提,因为我不得不手动下载EclipseJDT,正如本文所述:)。以上所有操作都在Windows7上运行

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

是的,Android已经导入(平台Android-15),还有我的Android项目。。。这是我的图书馆:

运行配置:

  • 在所选项目中运行所有测试
  • 测试运行程序是JUnit4
  • 使用EclipseJUnitLauncher(和而不是安卓JUnitTestLauncher)
  • 在arguments选项卡中,我将工作目录设置为${workspace\u 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,并使用我们需要的插件(Android DDMS、Android开发工具、Android原生开发工具)安装EclipseLuna。这并不比安装ADT复杂多少,现在测试运行良好。这个问题仍然无法解释…

不确定是否相关,但您为什么使用如此旧版本的Robolectric?这确实是一个好问题:在我同事的设置中,使用ADT22.3,新版本的Robolectric将无法工作。我们用ADT 23尝试了各种版本(包括最新版本)的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);
    }
}