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

Posted

技术标签:

【中文标题】线程“主”java.lang.NoClassDefFoundError 中的异常:junit/textui/ResultPrinter【英文标题】:Exception in thread "main" java.lang.NoClassDefFoundError: junit/textui/ResultPrinter 【发布时间】:2013-10-31 05:31:22 【问题描述】:

我正在尝试在 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。也许我无意中打开了某个选项?在这种情况下,如何在我的项目中禁用单元测试?有任何想法吗?

【问题讨论】:

尝试在lib目录下添加jar(可能是junit)!!! @Janne 你想单独运行单元测试吗?如果是这样,那可能是我收到此错误的原因。 【参考方案1】:

终于找到了。它位于“运行/调试配置”对话框中。禁用 JUnit 并再次编译。

【讨论】:

我在 Android Studio 0.4.2 上遇到了同样的问题。我实际上尝试将测试作为常规 JUnit 测试用例而不是 Android 测试用例运行。 为什么不能将 TestSuite 作为常规 JUnit 测试用例运行? @IgorGanapolsky 作为 JUnit 测试而不是 Android 测试运行意味着它将在主机系统而不是设备上运行。作为 android 测试运行会将测试 apk 部署到设备并在那里运行(在 dalvik vm 下)。很久以前,我安装了 Eclipse,因此我可以针对 android 项目中的代码运行 JUnit 测试;但是,它只适用于不使用任何 Android 类(Activity、View、Intent 等)的类。如果包含任何内容,则有一个存根实现来支持针对签名进行编译,但是在运行时,它会抛出 RuntimeException: "Stub!" 我似乎也有同样的问题。你告诉我在 Run->Edit Configurations 下禁用 junit... 即使我在那里找到了一个 junit 选项卡,我也没有看到任何禁用它的复选框,或类似的。我应该怎么做才能禁用它?你能帮我澄清一下吗? 好吧,我不确定我做了什么,但不知何故,我弄乱了运行->编辑配置......足够长的时间。谢谢!【参考方案2】:

这个问题通常是因为错误的测试类型:Junit 而不是Android Test

【讨论】:

【参考方案3】:

对于标准 JUnit 测试,您缺少 JUnit 库,请尝试在 build.gradle 中添加它:

dependencies 
    ...
    testCompile 'junit:junit:4.12'
    ...

并确保将测试放在与“main”包平行的“test”目录中(仪器测试进入“androidTest”,但这是不同的设置)。

【讨论】:

src/test/java 参考:Run Local Unit Tests【参考方案4】:

通过菜单强制项目“同步”:Tools > Android > Sync Project with Gradle Files 或通过在 build.gradle 文件中进行虚假更改来强制项目“同步”(添加一个空格,然后将其删除,然后单击“立即同步”)。

【讨论】:

【参考方案5】:

在我的运行/调试配置中,我在 AndroidTests 和 JUnitTests 下都有 MyTest。 AndroidTests 下的 MyTest 配置正确,但我仍然收到 'NoClassDefFoundError: junit/textui/ResultPrinter' 错误。单击 JUnit 下的 MyTest 并按下左上角的“-”。这使得 MyTest 可以在设备中运行而摆脱错误。

【讨论】:

【参考方案6】:

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

只需关闭并重新打开 Android Studio 即可为我修复它(版本 2.1.2 和 2.2)。

【讨论】:

【参考方案7】:

所有答案都很好-

确保您的 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'

【讨论】:

【参考方案8】:

只要把对我有用的解决方案,如果你是第一次设置环境,应该尝试一下:

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

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

【讨论】:

以上是关于线程“主”java.lang.NoClassDefFoundError 中的异常:junit/textui/ResultPrinter的主要内容,如果未能解决你的问题,请参考以下文章

主线程啥都没做,就会等待子线程结束。这是为啥?

Android 异步操作Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

子线程怎么不阻塞主线程

QT中UI主窗口如何与子线程相互传递参数

java 子线程 回调 主线程

C++怎么在主线程中使用子线程的数据? 比如说主线程中有一个数组,如何在子线程中调用这个数组