【问题标题】:NoClassDefFoundError while trying to run unit tests on Android Studio尝试在 Android Studio 上运行单元测试时出现 NoClassDefFoundError
【发布时间】:2014-11-11 14:29:33
【问题描述】:

我正在尝试为我的 Android 应用程序创建一些简单的测试,但在让测试运行时遇到了问题。我在尝试运行测试时不断收到 NoClassDefFound 错误,但我似乎无法弄清楚它的原因是什么。如果我能换一双新的眼睛来看看这个,我将不胜感激。

编辑:这是结构的图片:

这是我不断收到的错误:

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)

相机测试

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

扫描结果活动

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

【问题讨论】:

  • 您是作为 Android 测试而不是 JUnit 测试运行的吗?
  • @helleye 我相信我正在将测试作为 Android 测试运行,是的。
  • 从代码看来,您的测试类在package nl.hanze.myhealth; 中,而不是在测试包中。
  • @helleye 我在 OP 中包含了结构的图片。 androidTest 文件夹由 Android Studio 生成。
  • 错误状态:(java.lang.NoClassDefFoundError: nl.hanze.myhealthtests.ScanResultActivity)。那么你在哪里定义了 nl.hanze.myhealthtests 呢?

标签: android unit-testing noclassdeffounderror


【解决方案1】:

这也发生在我身上,不知道是不是和你一样的原因,但为我解决的问题是一个简单的File-&gt;Invalidate Caches / Restart

【讨论】:

  • 重新同步 gradle 也解决了我的问题
【解决方案2】:

我在以包 (JUnit/Robolectric3/Gradle) 运行测试的 Android Studio 中突然开始收到此错误,但不知道为什么。我能够很好地独立运行测试文件,但是在包内同时运行所有测试时出现 NoClassDefFoundError 异常。

原来在运行时类路径没有正确加载类。该问题无法在另一台机器上重现。

为了修复它,我删除了我的项目 .idea 文件夹和 .iml 文件,然后将整个 Gradle 项目重新导入到 Android Studio。然后就成功了!

【讨论】:

【解决方案3】:

1) 将您的测试放入包 nl.hanze.myhealth.tests。 您可以使用 Android Studio 或手动执行此操作:

  • 在 ...\app\src\androidTest\java\nl\hanze\myhealth\ 中创建一个新文件夹 tests
  • 将 ApplicationTest.java 和 CameraTest.java 移入 ...\app\src\androidTest\java\nl\hanze\myhealth\tests\
  • 将每个 java 测试文件中的包名重命名为
    package nl.hanze.myhealth.tests;

2) 在您的应用程序的 build.gradle 中,您需要:

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

重建并运行。应该够了。

【讨论】:

  • 祝您编写测试顺利。最近我和他们有很多问题:)
  • 我不明白为什么重命名测试包是必要的,或者为什么它有效。这通常是没有必要的。测试通常与被测类在同一个包中。
  • @AdilHussain,是的,我最近几次编写测试它在没有重命名测试包的情况下工作。我想工具链中同时进行了一些更新。
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 2013-01-01
  • 2019-11-08
  • 2015-06-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2016-10-29
相关资源
最近更新 更多