Android Unit Test在Log上抛出NoClassDefFoundError

时间:2012-01-11 20:08:26

标签: java android unit-testing junit

当我尝试在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

Screen shot of a beside JUnit icon

5 个答案:

答案 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;
    }
}