当我试图在eclipse中运行我的单元测试项目时,我得到了一个java.lang.NoClassDefFoundError: android/util/Log
错误。
精简下来,我的测试代码看起来像这样:
package com.randomtype.yycparking;
import junit.framework.TestCase;
import android.util.Log;
public class StallTests extends TestCase {
public void setUp() {
Log.v("HI", "Fail");
}
public void testShouldParseIdFromTitle() {
assertTrue(true);
}
}
代码在Log.v
调用时抛出异常。当我正常运行android项目时,我没有得到任何关于Log
的异常。
全栈跟踪:
java.lang.NoClassDefFoundError: android/util/Log
at com.randomtype.yycparking.StallTests.setUp(StallTests.java:11)
at junit.framework.TestCase.runBare(TestCase.java:132)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: android.util.Log
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 14 more
正如dtmilano所指出的,我并没有以Android JUnit Test
的身份运行单元测试。你怎么能分辨出来呢?看看下面图片中的小a:
(来源:skitch.com)
6条答案
按热度按时间puruo6ea1#
您的测试应该在一个单独的Android测试项目中(项目-> Android工具->新Android项目),并且您应该将它们作为Android JUnit测试运行(运行方式-> Android JUnit测试)。
hwazgwia2#
今天,当我在项目中运行单元测试时,我遇到了同样的错误--我的100多个单元测试突然失败了,尽管它们一周前还在工作(我没有做任何更改)。解决方案是重新启动Android Studio。我认为Android Studio的3.5.x版本中存在一个错误,随着时间的推移,它可能会丢失运行单元测试的配置,并开始抛出这样的错误。
yk9xbfzb3#
同样的错误,其他的原因...
我的测试类在一个匿名包中,但它与AndroidManifest.xml不一致:
[same答案发表在这里]
mspsb9vt4#
参考http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-
我发现我的问题:通知你的build.gradle文件,你应该设置compileSdkVersion等于23和targetSdkVersion相同,它工作得很好。
xriantvc5#
我在运行Android with mocks for the
Log
methods的JUnit测试时遇到了这个问题,因为我的单元测试不应该依赖于Android自己的实现。所以我在
test/java/android/util/Log.java
中进行了模拟-除了Log.v
方法。在mocks中添加v
方法之后,一切又正常了。jucafojl6#
现在是2023年。Eclipse不再支持Android开发。我正在使用最新和最好的Android Studio(2022.2.1 Patch 2)和Android SDK 33。
JUnit测试与要测试的类在同一个模块/库中,而不是在单独的模块/库中。因此,使用mock作为here建议的Log方法对我来说是不实际的。
特别是当我已经让我的JUnit测试在没有这样的mocks的情况下工作时,在将我的环境从Java 8更新到17之前,使用:
所以......经过一些故障排除,我发现这个新引入的
java.lang.NoClassDefFoundError: android/util/Log
(在将JDK 8更新到JDK 17之后)的根本原因是我的Run/Debug Configurations
>JUnit
>Build and run
部分中的classpath:我已经有了
-cp MyProj.myLib.main
,但我需要添加android.jar
来消除这个错误。我是这样做的:1.文件>项目结构> SDK位置(找到android.jar的确切路径)
Run/Debug Configurations
>JUnit
>Build and run
>修改选项:检查Modify classpath
。1.在新添加的标记为“Modify classpath”的框中(作为上一步的结果),单击
+
以添加C:\Users\Me\AppData\Local\Android\Sdk\platforms\android-33\android.jar
现在就像一个魅力。