运行 Robolectric 来自 gradle 的测试给出了 OutOfMemoryError。来自 Android Studio 的罚款

Running Robolectric test from gradle gives OutOfMemoryError. Fine from AndroidStudio

如果我从 AndroidStudio 运行 我的 Robolectric 单元测试一切都很好,我的所有测试都通过了。如果我尝试从命令行 运行 它们,“./gradlew clean test” 我得到 OutOfMemoryError 错误。

我试过编辑项目根目录下的gradle.properties文件,好像没有效果。我什至将内存限制设置为 8g,但仍然出现内存不足错误,所以我认为文件没有任何影响。

项目 -> gradle.properties

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# 
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

堆栈跟踪

objc[18543]: Class JavaLaunchHelper is implemented in both     /Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_72.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.

com.foo.android.ui.MapControllerFragmentTest > testSomething FAILED
java.lang.NoClassDefFoundError at MapControllerFragmentTest.java:92
    Caused by: java.lang.ClassNotFoundException at MapControllerFragmentTest.java:92

com.foo.android.ui.MapFragmentTest > testGoogleMapListenersRemovedOnDestroy FAILED
java.lang.OutOfMemoryError

com.foo.android.ui.MapFragmentTest > testLifecyclesPassedToMapView FAILED
java.lang.NoClassDefFoundError at MapFragmentTest.java:37

Unexpected exception thrown.
java.lang.OutOfMemoryError: PermGen space
at sun.misc.Unsafe.defineClass(Native Method)
at sun.reflect.ClassDefiner.defineClass(ClassDefiner.java:63)
at sun.reflect.MethodAccessorGenerator.run(MethodAccessorGenerator.java:399)
at sun.reflect.MethodAccessorGenerator.run(MethodAccessorGenerator.java:396)
at java.security.AccessController.doPrivileged(Native Method)
at sun.reflect.MethodAccessorGenerator.generate(MethodAccessorGenerator.java:395)
at sun.reflect.MethodAccessorGenerator.generateSerializationConstructor(MethodAccessorGenerator.java:113)
at sun.reflect.ReflectionFactory.newConstructorForSerialization(ReflectionFactory.java:331)
at java.io.ObjectStreamClass.getSerializableConstructor(ObjectStreamClass.java:1376)

我试过 answers from other threads 但没有成功。它似乎只在涉及 Activity 或 Fragment 时抛出错误。

Eugen 是正确的。一旦我更新到 JDK 8,我的内存不足错误就消失了。

解决了这个问题后,我遇到了每个人在使用 运行 Robolectric 从图书馆时都会遇到的第一个问题:找不到资源。许多人建议将所有文件复制过来。对我来说,就像在 gradle

中设置 src 目录一样简单
android {
....
    sourceSets {
    // a work around for robolectric
    // https://github.com/robolectric/robolectric/issues/1796
    test.java.srcDirs += '../App/build/generated/source/r/debug'
}