NoClassDefFoundError while trying to run unit tests on Android Studio
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!
Anubis
Updated on July 03, 2022Comments
-
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:
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; } }