线程“主”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 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )