【问题标题】:Android Unit Test throws NoClassDefFoundError on LogAndroid单元测试在日志上抛出NoClassDefFoundError
【发布时间】:2012-01-11 20:08:25
【问题描述】:

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

【问题讨论】:

    标签: java android unit-testing junit


    【解决方案1】:

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

    【讨论】:

    • 检查项目属性(Java 构建路径 -> 库)。验证 android 是否存在。
    • 等一下!我将它作为Android JUnit Test 运行。我不小心以JUnit Test 的身份运行它
    • 这些测试是否必须扩展某些东西,或者它们可以只是 JUnit4 测试?
    • 看看developer.android.com/tools/testing/testing_android.html。您的测试用例可能应该扩展任何专门的 android 测试用例。
    • 我没有“Run as -> Android JUnit Test”选项,这可能来自 Android Studio 的一个版本。但是,在“运行/调试配置窗口”中,我可以在配置为在我的主包上使用默认 JRE 运行的 Android JUnit 列表下看到我的测试。这仍然会在 Log 类丢失时出现异常。你是在告诉我我必须将它作为工具 JUnit 测试运行吗? (又名在模拟器中)仅仅因为我的班级有日志? (即使这是 Android 使用的唯一 api)?我不敢相信没有其他解决方案......不,我不认为returnDefaultValues 是一个解决方案。
    【解决方案2】:

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

    【讨论】:

    • 谢谢。就是这样,我永远不会想到那个方向。
    【解决方案3】:
     android {
      // ...
      testOptions { 
        unitTests.returnDefaultValues = true
      }
    }
    

    参考 http://tools.android.com/tech-docs/unit-testing-support#TOC-Method-...-not-mocked.-

    我发现了我的问题:通知你的 build.gradle 文件,你应该设置 compileSdkVersion 等于 23 和 targetSdkVersion 一样,它工作得很好。

    【讨论】:

      【解决方案4】:

      我在为 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;
          }
      }
      

      【讨论】:

        【解决方案5】:

        同样的错误,其他原因...

        我的测试类在一个匿名包中,但它与 AndroidManifest.xml 不一致:

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

        [发布相同的答案here]

        【讨论】:

          猜你喜欢
          • 2014-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-31
          • 2023-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多