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

使用AndroidStudio运行JUnit测试时出现异常:java.lang.NoClassDefFoundError:android/os/Parcelable,java,android,unit-testing,android-studio,junit4,Java,Android,Unit Testing,Android Studio,Junit4,我已经按照创建了单元测试,但当我运行它们时,会出现一个异常: 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.define

我已经按照创建了单元测试,但当我运行它们时,会出现一个异常:

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
java.lang.NoClassDefFoundError:android/os/Parcelable
位于java.lang.ClassLoader.defineClass1(本机方法)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:800)
位于java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
位于java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
在java.net.URLClassLoader.access$100(URLClassLoader.java:71)
在java.net.URLClassLoader$1.run(URLClassLoader.java:361)
在java.net.URLClassLoader$1.run(URLClassLoader.java:355)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:354)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:425)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:358)
位于java.lang.Class.getDeclaredMethods0(本机方法)
位于java.lang.Class.privateGetDeclaredMethods(Class.java:2615)
位于java.lang.Class.getDeclaredMethods(Class.java:1860)
位于org.junit.internal.MethodSorter.getDeclaredMethods(MethodSorter.java:54)
位于org.junit.internal.runners.JUnit38ClassRunner。(JUnit38ClassRunner.java:74)
位于org.junit.internal.builders.JUnit3Builder.runnerForClass(JUnit3Builder.java:11)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
位于org.junit.internal.builders.AllDefaultPossibilityBuilder.runnerForClass(AllDefaultPossibilityBuilder.java:26)
位于org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
位于org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
位于org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:36)
位于com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:41)
位于com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
位于com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
位于com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
原因:java.lang.ClassNotFoundException:android.os.Parcelable
在java.net.URLClassLoader$1.run(URLClassLoader.java:366)
在java.net.URLClassLoader$1.run(URLClassLoader.java:355)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:354)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:425)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 33多
以下是我的一个测试的片段:

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();
package com.aadhk.woinvoice.bean;
导入com.aadhk.woinvoice.util.Constant;
导入junit.framework.TestCase;
导入java.util.ArrayList;
导入java.util.List;
公共类InvoiceCalculatorTest扩展了TestCase{
私有静态最终双ε=1e-4;
public void testNoTaxNoDiscount(){
发票=新发票();
列表项=新建ArrayList();
InvoiceItem=新的InvoiceItem();
我使用的是Android Studio 1.1,Android插件版本为1.1.3,Gradle版本为2.2.1


我正在讨论的代码确实实现了Parsable接口,但我希望有一种方法可以运行这些测试。这些测试本身并没有以任何方式运行或使用Parsable。

只是使用IntelliJ遇到了这个问题,但我想这对安卓Studio也适用

我通过编辑测试的运行/调试配置,检查“使用替代JRE”并尝试不同的Android平台,解决了这个问题。我建议尝试不同的平台,看看它是否解决了这个问题。 作为

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


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

测试可以从命令行正常运行。/gradlew testFreeDebug--tests='*.InvoiceCalculatorTest'我不会将此作为答案发布因为我不知道为什么它会被修复。我还将android studio更新为1.3.0,突然我可以单独再次运行测试。插件在几年后也是1.3.0,并且仍然适用。有什么想法/理论可以解释为什么会发生这种情况吗?如果你使用常规Java sdk来运行测试,它将不会有Parcelable,因为它只存在于android系统中这就是为什么在android sdk中设置一个替代JRE显式解决了这个问题。这非常有用。谢谢!