"主线程中的异常:java.lang.NoClassDefFoundError:junit/textui/ResultPrinter"

62

我正在尝试在Android Studio 0.3.0中编译我的Android项目。今天我遇到了以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:188)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:113)
Caused by: java.lang.ClassNotFoundException: junit.textui.ResultPrinter
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
... 3 more

Process finished with exit code 1

通过一些网络搜索,我认为这个问题与JUnit有关。然而,在我的项目中,我没有使用JUnit。也许我无意中打开了某个选项?如果是这样,我该如何在我的项目中禁用单元测试?有什么想法吗?


1
尝试将JAR文件(可能是junit)添加到lib目录中! - Fernando Carvalho
1
@Janne 你是在尝试隔离地运行单元测试吗?如果是的话,那可能是这个错误的原因,因为我也遇到了这个问题。 - IgorGanapolsky
8个回答

57

终于找到了。它在“运行/调试配置”对话框中。禁用 JUnit 后,它又可以编译了。


10
我在Android Studio 0.4.2上遇到了相同的问题。实际上,我尝试将测试运行为普通的JUnit测试用例,而不是Android测试用例。 - pkk
13
为什么不能将TestSuite作为常规的JUnit测试用例运行? - IgorGanapolsky
2
运行作为 JUnit 测试而不是 Android 测试意味着它将在主机系统上运行,而不是在设备上运行。作为 android 测试运行会将测试 apk 部署到设备上并在其中运行(在 dalvik vm 下)。很久以前,我有一个 Eclipse 设置,可以针对 android 项目内部的代码运行 JUnit 测试;但是,它只适用于不使用任何 Android 类的类(Activity、View、Intent 等)。如果包含任何内容,则会有一个桩实现来支持根据签名编译,但运行时会抛出 RuntimeException:"Stub!" - Stan Kurdziel
1
我好像也遇到了同样的问题。你让我在Run->Edit Configurations下禁用JUnit,虽然我能找到JUnit选项卡,但我没有看到任何复选框来禁用它或类似的选项。请问我应该怎么做才能禁用它?你能给我解释一下吗? - Kagaratsch
好的,我不确定我做了什么,但是在玩弄“运行->编辑配置”足够长的时间后,我终于让它工作了。谢谢! - Kagaratsch
详细说明及截图请参见:https://dev59.com/yYbca4cB1Zd3GeqPac21?answertab=votes#tab-top - vikoo

27

通常这个问题是由于测试类型选择错误导致的:Junit 而不是 Android Test 选择 Android 测试而不是 JUnit 选择 Android 测试而不是 JUnit


8

对于标准的JUnit测试,您缺少JUnit库,请尝试在build.gradle中添加以下内容:

dependencies {
    ...
    testCompile 'junit:junit:4.12'
    ...
}

请确保您将测试放置在与"main"包并列的"test"目录中(仪器测试放入"androidTest",但这是不同的设置)。


src/test/java 参考:运行本地单元测试 - Ivan Chau

7

通过菜单强制使项目"同步": 工具 > Android > 与Gradle文件同步项目 或者通过在build.gradle文件中进行虚假更改(添加一个空格,然后删除它,然后点击“立即同步”)来强制使项目"同步"。


1
在我的运行/调试配置中,我将MyTest分别放置在AndroidTests和JUnitTests下。AndroidTests下的MyTest已正确配置,但仍然出现“NoClassDefFoundError:junit/textui/ResultPrinter”错误。点击JUnit下的MyTest并按左上角的“-”符号。这样可以让MyTest通过设备运行且消除错误。

0

我曾经在更改一些build.gradle插件和依赖项后两次遇到了这个问题。

简单地关闭并重新打开Android Studio就解决了这个问题(版本为2.1.2和2.2)。


0

所有的答案都很好 -

确保你的sourceSets已经注册了测试目录。

android{
    ...

    defaultConfig {
         ...
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }


    sourceSets {
        androidTest {
            java.srcDirs = ['src/androidTest/java']
        }
    }
}

dependencies{
    ... 
    androidTestCompile 'junit:junit:4.12'
    androidTestCompile 'com.android.support.test:runner:0.5'
}

-2

我只是分享一下对我有效的解决方案,如果你是第一次设置环境,可以尝试一下:

对于Windows系统: 1)在环境变量中添加一个新的“系统变量” ANDROID_SDK_HOME=D:\Program Files\android-sdk-windows(选择你的Android SDK主目录)

2)修改系统变量Path,添加“%Android_SDK_HOME%\tools;”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接