【问题标题】:Testing library project with JUnit fails to instantiate android class element使用 JUnit 测试库项目无法实例化 android 类元素
【发布时间】:2014-03-25 22:31:24
【问题描述】:

我的 android 工作区中有一个类库。我现在正在尝试使用 JUnit 和 UNIT 测试来测试每个类。

我为库中的纯 java 类编写的第一个测试,它运行顺利

我为一个使用一些 android 类 (Rect) 的类编写的第二个测试,测试运行,但是当它必须实例化时 失败classNotFoundException目标类中的 Rect 字段。

这是有问题的代码(第 1161 行):

    1156        public Symbol(String name, int id) {
    1157            validateName(name);
    1158            this.name = name;
    1159            this.id = id;
    1160            this.value = null;
    1161            this.location = new Rect();
    1162            this.precedence = 0;
    1163            this.associativity = Associativity.PRECEDENCE;
    1164        }

这是错误信息:

    java.lang.NoClassDefFoundError: android/graphics/Rect
        at com.Common.lib.Grammar$Symbol.<init>(Grammar.java:1161)
        at com.Common.lib.Grammar$Terminal.<init>(Grammar.java:1285)
        at com.Common.lib.Grammar$Terminal.<init>(Grammar.java:1284)
        at com.Common.lib.Grammar.createTerminal(Grammar.java:558)
        at com.Common.lib.Grammar.<init>(Grammar.java:77)
        at com.Common.lib.GrammarTest.testGrammar(GrammarTest.java:39)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        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.graphics.Rect
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 30 more

【问题讨论】:

    标签: java android junit4


    【解决方案1】:

    这是因为您的测试类路径不包含 android 类。来自文档(https://developer.android.com/tools/testing/testing_android.html):

    Android 测试套件基于 JUnit。您可以使用纯 JUnit 来测试不调用 Android API 的类,或使用 Android 的 JUnit 扩展 来测试 Android 组件。如果您不熟悉 Android 测试,您可以从通用测试用例类(例如 AndroidTestCase)开始,然后继续使用更复杂的类。

    如果您的代码是 apklib(而不是应用程序),则有两种测试方法。引用文档)

    • 您可以设置一个测试项目来检测依赖于库项目的应用程序项目。然后,您可以为项目添加针对库特定功能的测试。
    • 您可以建立一个依赖于库的标准应用程序项目,并将检测工具放入该项目中。这使您可以创建一个独立的项目,其中包含测试/仪器和要测试的代码。

    http://developer.android.com/tools/projects/index.html#testing

    作为奖励(非强制性),您可以使用 roboelectric (http://robolectric.org/) 来避免 java.lang.RuntimeException: Stub(但不是 ClassNotFoundException)异常并在没有模拟器的情况下运行测试。

    【讨论】:

    • 将 android 类添加到类路径时,我得到一个更早的错误(java.lang.String 在值的布局无效),这就是我首先将其删除的原因(参见@ 987654324@)。我使用的测试是由 JUnit 生成的自动测试模板,虽然我现在将其更改为 AndroidTestCase 我无法告诉你它是否有效,因为我现在遇到了上述错误。
    • 您是否按照此处的说明创建了一个 android 测试项目? developer.android.com/tools/testing/testing_eclipse.html 它会在您的清单中添加一个 元素。还是您的测试类与您的应用程序在同一个项目中定义?
    • 我确实按照开发者网站中的描述从头开始创建了测试项目,与您在上一条评论中提供的链接相同。现在报错是Instrumentation找不到目标包apk,不存在因为我的目标项目是Library,不是Application,存在jar,我尝试添加到构建路径,但是没有解决问题。
    • 我遵循了所有建议,但仍然失败,我在新帖子中详细描述了我所做的一切 (stackoverflow.com/questions/21992150/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多