2014-09-17 4 views
4

Android 앱에 대한 간단한 테스트를 만들고 싶지만 테스트를 실행하는 데 문제가 있습니다. 테스트를 실행하는 동안 계속 NoClassDefFound 오류가 발생하지만 그 원인을 파악할 수 없습니다. 이걸 보려고 눈을 뜰 수 있다면 고맙겠습니다.Android Studio에서 단위 테스트를 실행하는 동안 NoClassDefFoundError

편집 :

junit.framework.AssertionFailedError: Exception in constructor: testScanResultNotNull (java.lang.NoClassDefFoundError: nl.hanze.myhealth.ScanResultActivity 
at nl.hanze.myhealth.CameraTest.<init>(CameraTest.java:14) 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
at junit.runner.BaseTestRunner.getTest(BaseTestRunner.java:118) 
at android.test.AndroidTestRunner.getTest(AndroidTestRunner.java:149) 
at android.test.AndroidTestRunner.setTestClassName(AndroidTestRunner.java:57) 
at android.test.suitebuilder.TestSuiteBuilder.addTestClassByName(TestSuiteBuilder.java:80) 
at android.test.InstrumentationTestRunner.parseTestClass(InstrumentationTestRunner.java:443) 
at android.test.InstrumentationTestRunner.parseTestClasses(InstrumentationTestRunner.java:424) 
at android.test.InstrumentationTestRunner.onCreate(InstrumentationTestRunner.java:370) 
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4435) 
at android.app.ActivityThread.access$1300(ActivityThread.java:141) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5103) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method) 
) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) 
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) 
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) 
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701) 

CameraTest

package nl.hanze.myhealth; 

import android.test.ActivityInstrumentationTestCase2; 
import android.test.suitebuilder.annotation.SmallTest; 

    public class CameraTest extends ActivityInstrumentationTestCase2<ScanResultActivity> { 

     ScanResultActivity mActivity; 

     public CameraTest(){ 
      super(ScanResultActivity.class); 
     } 

     @Override 
     protected void setUp()throws Exception{ 
      super.setUp(); 
      mActivity = getActivity(); 
     } 

     @SmallTest 
     public void testScanResultNotNull(){ 
      boolean test = mActivity.generateScanResult(); 
      assertNotNull(test); 
     } 

     @Override 
     protected void tearDown() throws Exception{ 
      super.tearDown(); 
     } 
    } 

ScanResultActivity

0 :

여기 Link

내가 점점 계속 오류입니다 : 여기에 구조의 사진입니다

package nl.hanze.myhealth; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

import java.util.Random; 


    public class ScanResultActivity extends Activity { 

     Random rand = new Random(); 

     public ScanResultActivity(){ 

     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_scan_result); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.scan_result, menu); 
      return true; 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      // Handle action bar item clicks here. The action bar will 
      // automatically handle clicks on the Home/Up button, so long 
      // as you specify a parent activity in AndroidManifest.xml. 
      int id = item.getItemId(); 
      if (id == R.id.action_settings) { 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 

     protected boolean generateScanResult(){ 
      boolean positive_scanresult; 
      int max = 10; 
      int min = 1; 
      int randomNum = rand.nextInt((max - min) + 1) + min; 
      if(randomNum >= 6){ 
       positive_scanresult = true; 
      }else{ 
       positive_scanresult = false; 
      } 
      return positive_scanresult; 
     } 
    } 
+0

JUnit 테스트가 아닌 Android 테스트로 실행하고 있습니까? – helleye

+0

@helleye 나는 안드로이드 테스트로 테스트를 수행하고 있다고 생각한다. – Anubis

+0

코드에서 테스트 클래스가 테스트 패키지가 아닌'패키지 nl.hanze.myhealth;'에있는 것 같습니다. – helleye

답변

4

1) 테스트를 nl.hanze.myhealth.tests 패키지에 넣으십시오. 수동 안드로이드 Studio를 사용하여 그렇게 할, 또는 수 있습니다

  • 새 폴더를 테스트를 만들 내부 ... \ 응용 프로그램 \ SRC \ androidTest \ 자바 \ NL \ hanze \ myhealth
  • 이동 ApplicationTest \. 내부 자바와 CameraTest.java ... \ 응용 프로그램 \ SRC \ androidTest \ 자바 \ NL \ hanze \
    패키지 nl.hanze.myhealth에 자바 테스트 파일의 각 패키지 이름을 이름을 변경
  • \ myhealth의 \ 테스트 . 테스트;

    defaultConfig { 
        applicationId "nl.hanze.myhealth" 
        testApplicationId "nl.hanze.myhealth.tests" 
        ... 
    } 
    

    가 재 구축 및 실행 : 당신이 응용 프로그램의 build.gradle에서

2) 당신은 할 필요가있다. 그 정도면 충분합니다.

+0

감사합니다. – Anubis

+0

시험 쓰기에 좋은 행운을 보냅니다. 나는 최근에 그들에게 많은 문제가있다. :) – helleye

+2

왜 테스트 패키지의 이름을 바꾸는 것이 필요한지, 왜 작동하는지 알지 못한다. 이것은 일반적으로 필요하지 않습니다. 테스트는 일반적으로 테스트중인 클래스와 동일한 패키지에 있습니다. –

6

패키지 (JUnit/Robolectric3/Gradle)로 테스트를 실행하는 Android Studio에서 갑자기이 오류가 발생하기 시작했으며 이유가 없습니다. 테스트 파일을 독립적으로 실행할 수 있었지만 패키지 내부에서 모든 테스트를 실행할 때 NoClassDefFoundError 예외가 발생했습니다.

런타임 중에 클래스를 올바르게로드하지 못했습니다. 다른 컴퓨터에서 문제를 재현 할 수 없습니다.

해결하려면 프로젝트 .idea 폴더와 .iml 파일을 삭제 한 다음 전체 Gradle 프로젝트를 Android Studio로 다시 가져 왔습니다. 그 때 그것은 일했다!

+0

이 제안을 주셔서 감사합니다. 또한 모듈 종속성 중 일부가 잘못 구성되었을 수 있습니다. https://stackoverflow.com/questions/37319185를 참조하십시오. – TheIT

관련 문제