当我尝试在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 :
答案 0 :(得分:4)
您的测试应该在单独的Android测试项目中(项目 - > Android工具 - >新的Android项目),您应该将它们作为Android JUnit测试运行(运行为 - > Android JUnit测试)。
答案 1 :(得分:1)
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
参考 http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-
我发现我的问题:通知你的build.gradle文件,你应该将compileSdkVersion设置为23并且与targetSdkVersion相同,它运行良好。
答案 2 :(得分:0)
这里的错误,其他原因......
我的测试类是在一个匿名包中,但它与AndroidManifest.xml不一致:
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="micharg.nameanimalthing" />
[发布here]
的相同答案答案 3 :(得分:0)
今天,当在我的项目中运行单元测试时,我遇到了同样的错误-即使100多个单元测试一周前都在工作(我没有做任何更改),但它们突然失败了。 解决方案是重新启动Android Studio。我认为Android Studio 3.5.x版本中存在一个错误,随着时间的流逝,它可能会丢失用于运行单元测试的配置,并会开始引发诸如此类的错误。
答案 4 :(得分:0)
我在为Android with mocks for the Log
methods运行JUnit测试时遇到了这个问题,因为我的单元测试不应该依赖于Android自己的实现。
因此,我在test/java/android/util/Log.java
中使用了模拟–除Log.v
方法以外的所有模拟。在模拟中添加v
方法之后,一切又恢复正常了。
package android.util;
public class Log {
public static int d(String tag, String msg) {
System.out.println("DEBUG: " + tag + ": " + msg);
return 0;
}
public static int i(String tag, String msg) {
System.out.println("INFO: " + tag + ": " + msg);
return 0;
}
public static int w(String tag, String msg) {
System.out.println("WARN: " + tag + ": " + msg);
return 0;
}
public static int e(String tag, String msg) {
System.out.println("ERROR: " + tag + ": " + msg);
return 0;
}
public static int v(String tag, String msg) {
System.out.println("VERB: " + tag + ": " + msg);
return 0;
}
}