2014-09-05 1 views
1

JUnit, Mockito 및 Robolectric를 사용하여 단위 테스트를 설정하려고하는 Android 프로젝트가 있습니다. 나는 ADT23을 사용하고있다. (이 게시물을 통해 이클립스 JDT를 수동으로 다운로드해야했기 때문에 이것에 대한 언급이 필요하다 : https://stackoverflow.com/a/25519274/3519951). 위의 모든 것은 Windows 7에서 실행됩니다.NoClassDefFoundError with Robotlectric with ADT23 and Android 15

테스트를 실행할 때 Android보기에서 NoClassDefFoundError 오류가 발생했습니다.

예, 안드로이드 가져 (플랫폼 안드로이드-15)뿐만 아니라, 내 안드로이드 프로젝트로 ... 여기 내 librairies 있습니다

Imported librairies

실행 구성 :

  • 모든 실행 선택한 프로젝트의 테스트
  • 테스트 러너는 JUnit입니다. 4
  • Eclipse JUnit Launcher (및 아니요 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 실행을 제외하고 우리는 어떤 표시하는 차이를 찾을 수 없습니다. 어떤 도움을 주셔서 감사합니다, 대단히 감사합니다!

편집 : 여러분 중 일부는 테스트 클래스를보고 싶을 것이라고 생각했습니다. 당신은

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); 
    } 
} 
+0

Robolectric과 같은 오래된 버전을 사용하는 이유는 무엇입니까? –

+0

정말로 좋은 질문입니다. ADT22.3을 사용하면 제 동료의 설정에서 Robolectric의 최신 버전이 작동하지 않습니다. 우리는 ADT 23이있는 Robolectric의 다양한 버전 (최신 버전 포함)을 시도했지만 그 중 아무 것도 작동하지 않는 것 같습니다. –

답변

0

문제가 해결 ... 오류가 정말 Robolectric의 초기화와 관련이 있으므로, 거기에 안드로이드 객체도 참조가없는 것을 확인할 수 있습니다.

우리는 ADT를 사용하여 종료하고 Eclipse Luna를 필요한 플러그인 (Android DDMS, Android 개발 도구, Android 기본 개발 도구)과 함께 설치하기로 결정했습니다. ADT를 설치하는 것보다 훨씬 복잡하지 않으며 이제는 테스트가 잘됩니다. 그 문제는 설명 할 수없는 채로 남아있을 것입니다 ...