junit Android单元测试在日志中抛出NoClassDefFoundError

htzpubme  于 2023-06-29  发布在  Android
关注(0)|答案(6)|浏览(158)

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

puruo6ea

puruo6ea1#

您的测试应该在一个单独的Android测试项目中(项目-> Android工具->新Android项目),并且您应该将它们作为Android JUnit测试运行(运行方式-> Android JUnit测试)。

hwazgwia

hwazgwia2#

今天,当我在项目中运行单元测试时,我遇到了同样的错误--我的100多个单元测试突然失败了,尽管它们一周前还在工作(我没有做任何更改)。解决方案是重新启动Android Studio。我认为Android Studio的3.5.x版本中存在一个错误,随着时间的推移,它可能会丢失运行单元测试的配置,并开始抛出这样的错误。

yk9xbfzb

yk9xbfzb3#

同样的错误,其他的原因...
我的测试类在一个匿名包中,但它与AndroidManifest.xml不一致:

<instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="micharg.nameanimalthing" />

[same答案发表在这里]

mspsb9vt

mspsb9vt4#

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}

参考http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-
我发现我的问题:通知你的build.gradle文件,你应该设置compileSdkVersion等于23和targetSdkVersion相同,它工作得很好。

xriantvc

xriantvc5#

我在运行Android with mocks for the Log methods的JUnit测试时遇到了这个问题,因为我的单元测试不应该依赖于Android自己的实现。
所以我在test/java/android/util/Log.java中进行了模拟-除了Log.v方法。在mocks中添加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;
    }
}
jucafojl

jucafojl6#

现在是2023年。Eclipse不再支持Android开发。我正在使用最新和最好的Android Studio(2022.2.1 Patch 2)和Android SDK 33。
JUnit测试与要测试的类在同一个模块/库中,而不是在单独的模块/库中。因此,使用mock作为here建议的Log方法对我来说是不实际的。
特别是当我已经让我的JUnit测试在没有这样的mocks的情况下工作时,在将我的环境从Java 8更新到17之前,使用:

logMockedStatic = Mockito.mockStatic(Log.class);

所以......经过一些故障排除,我发现这个新引入的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的确切路径)

  1. Run/Debug Configurations> JUnit> Build and run>修改选项:检查Modify classpath
    1.在新添加的标记为“Modify classpath”的框中(作为上一步的结果),单击+以添加C:\Users\Me\AppData\Local\Android\Sdk\platforms\android-33\android.jar
    现在就像一个魅力。

相关问题