NoClassDefFoundError while trying to run unit tests on Android Studio

11,461

Solution 1

1) Put your tests into package nl.hanze.myhealth.tests. You can do so using Android Studio, or manually:

  • create a new folder tests inside ...\app\src\androidTest\java\nl\hanze\myhealth\
  • move ApplicationTest.java and CameraTest.java inside ...\app\src\androidTest\java\nl\hanze\myhealth\tests\
  • rename the package name in each of your java test files to
    package nl.hanze.myhealth.tests;

2) In you application's build.gradle you need to have:

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

Rebuild and run. That should be enough.

Solution 2

This happened to me as well, not sure if it was for the same reason as you but what fixed it for me was a simple File->Invalidate Caches / Restart

Solution 3

I started getting this error suddenly in Android Studio running tests as packages (JUnit/Robolectric3/Gradle) and had no idea why. I was able to run the test files independently just fine, but I got the NoClassDefFoundError exception when running all tests together inside of a package.

Turns out the classpath during runtime wasnt loading classes correctly. The issue could not be reproduced on another machine.

To fix it, I deleted my project .idea folder and .iml files, then reimported the whole Gradle project to Android Studio. Then it worked!

Share:
11,461
Anubis
Author by

Anubis

Updated on July 03, 2022

Comments

  • Anubis
    Anubis almost 2 years

    I'm trying to create some simple tests for my Android app but I'm running into issues with getting the tests to even run. I keep getting a NoClassDefFound error while I'm trying to run the test, however I can't seem to figure out what the cause of it is. I'd appreciate it if I could get a fresh pair of eyes to look at this.

    EDIT: Here is a picture of the structure:

    Link

    Here's the error that I keep getting:

    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

    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;
            }
        }