在使用AndroidStudio运行JUnit测试时出现异常:java.lang.NoClassDefFoundError: android/os/Parcelable。

11

按照http://tools.android.com/tech-docs/unit-testing-support的说明,我创建了单元测试,但运行时出现异常:

java.lang.NoClassDefFoundError: android/os/Parcelable
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2615)
    at java.lang.Class.getDeclaredMethods(Class.java:1860)
    at org.junit.internal.MethodSorter.getDeclaredMethods(MethodSorter.java:54)
    at org.junit.internal.runners.JUnit38ClassRunner.<init>(JUnit38ClassRunner.java:74)
    at org.junit.internal.builders.JUnit3Builder.runnerForClass(JUnit3Builder.java:11)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:36)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:41)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.ClassNotFoundException: android.os.Parcelable
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    ... 33 more

这是我的一个测试片段:

package com.aadhk.woinvoice.bean;

import com.aadhk.woinvoice.util.Constant;

import junit.framework.TestCase;

import java.util.ArrayList;
import java.util.List;

public class InvoiceCalculatorTest extends TestCase {
  private static final double EPSILON = 1e-4;

  public void testNoTaxNoDiscount() {
    Invoice invoice = new Invoice();
    List<InvoiceItem> items = new ArrayList<>();
    InvoiceItem item = new InvoiceItem();

我正在使用Android Studio 1.1,Android插件版本为1.1.3,Gradle版本为2.2.1。

我要测试的代码确实实现了Parceable接口,但我希望有办法运行这些测试。这些测试本身并不以任何方式使用或操作Parceable。


测试从命令行运行良好。./gradlew testFreeDebug --tests='*.InvoiceCalculatorTest' - waterlooalex
我不会将此作为答案发布,因为我不知道为什么它修复了。我还升级了Android Studio到1.3.0版本,突然之间我可以再次独立运行测试。插件也是1.3.0版本的。 - Fred
2个回答

7

我在使用IntelliJ时遇到了这个问题,但我想Android Studio也会遇到类似的问题。

我通过编辑我的测试的运行/调试配置来解决此问题,并勾选“使用备用JRE”,然后尝试不同的Android平台。我建议尝试不同的平台,看是否可以解决这个问题。 测试配置截图


几年过去了,它仍然适用。有什么想法/理论为什么会发生这种情况? - Aguragorn
如果您使用常规的Java SDK运行测试,它将没有Parcelable,因为它仅存在于Android SDK中。这就是为什么明确设置替代JRE到Android SDK可以解决此问题的原因。 - Stevie Kideckel
这非常有帮助。谢谢! - Xi Wei

-1

正如David Rawson所说的

本地单元测试在您的笔记本电脑或桌面上在JVM中运行。因此,它们无法访问原生的Android类,例如Parcelable,如果您对使用这些方法的类运行本地单元测试,则会出现错误。

因此,我建议将您的测试类放在项目目录中的路径app/src/androidTest/java/your-project-package/your-test-class中。还要确保在设备或模拟器上运行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接