Robolectric R$颜色类DefNotFound
Robolectric R$color classDefNotFound
我正在尝试使用以下设置测试 android 库。 com.android.tools.build:gradle:1.2.0, org.robolectric:robolectric:3.0-rc2, android studio 1.2-rc-3
在我的测试设置中,我间接引用了另一个库的 R 文件。测试在 android studio 中运行良好,但在命令行中 运行 会产生以下错误。
java.lang.NoClassDefFoundError: robolectricdemo/com/baselibrary/R$color
at robolectricdemo.com.baselibrary.DemoStaticClass.getDemoResource(DemoStaticClass.java:12)
at LibraryResourceTest.setUp(LibraryResourceTest.java:25)
Caused by:
java.lang.ClassNotFoundException: robolectricdemo.com.baselibrary.R$color
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.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 org.robolectric.internal.bytecode.InstrumentingClassLoader.loadClass(InstrumentingClassLoader.java:98)
... 2 more
我在 http://github.com/tcw48/robolectricDemo 创建了我的代码的简化版本,其中包含以下重要片段。
测试class住在图书馆extendlibrary
RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class LibraryResourceTest {
private int color;
@Before
public void setUp() {
color = DemoStaticClass.getDemoResource(RuntimeEnvironment.application);
}
@Test
public void testLibraryResource(){
assertNotNull(color);
}
}
这个静态 class 存在于库 baselibrary 中。
public class DemoStaticClass {
public static int getDemoResource(Context context) {
return context.getResources().getColor(R.color.robo_red);
}
}
我注意到在构建目录中,仅在包 extendlibrary 中生成了一个 R 文件,但没有用于 baselibrary 的包。在名为 baselibrary 的包中手动创建 R 文件会导致测试通过。关于我可能做错了什么的任何想法。
R class 缺失,直到您提供一个 ;) 当您将有效的 R class 复制到预期的包时,尝试它是否也适用于您。
您必须更改复制任务中的路径以匹配您的包名称
afterEvaluate { project ->
android.libraryVariants.each { variant ->
// workaround for missing R class for aar dependencies
tasks.getByName("assemble${variant.name.capitalize()}").dependsOn copyAppcompat
// workaround for missing compilation of main sources
tasks.getByName("test${variant.name.capitalize()}") {
dependsOn "assemble${variant.name.capitalize()}"
}
}
}
task copyAppcompat(type: Copy) {
from 'build/generated/source/r/debug/com/example/core'
into 'src/test/java/android/support/v7/appcompat'
include 'R.java'
filter { line -> line.contains('package com.example.core;') ? 'package android.support.v7.appcompat;' : line }
}
这是一个依赖于其他库的示例项目 (aar) https://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar
这里是例子build.gradle
https://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar/core/build.gradle#L42
我正在尝试使用以下设置测试 android 库。 com.android.tools.build:gradle:1.2.0, org.robolectric:robolectric:3.0-rc2, android studio 1.2-rc-3
在我的测试设置中,我间接引用了另一个库的 R 文件。测试在 android studio 中运行良好,但在命令行中 运行 会产生以下错误。
java.lang.NoClassDefFoundError: robolectricdemo/com/baselibrary/R$color
at robolectricdemo.com.baselibrary.DemoStaticClass.getDemoResource(DemoStaticClass.java:12)
at LibraryResourceTest.setUp(LibraryResourceTest.java:25)
Caused by:
java.lang.ClassNotFoundException: robolectricdemo.com.baselibrary.R$color
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.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 org.robolectric.internal.bytecode.InstrumentingClassLoader.loadClass(InstrumentingClassLoader.java:98)
... 2 more
我在 http://github.com/tcw48/robolectricDemo 创建了我的代码的简化版本,其中包含以下重要片段。
测试class住在图书馆extendlibrary
RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class LibraryResourceTest {
private int color;
@Before
public void setUp() {
color = DemoStaticClass.getDemoResource(RuntimeEnvironment.application);
}
@Test
public void testLibraryResource(){
assertNotNull(color);
}
}
这个静态 class 存在于库 baselibrary 中。
public class DemoStaticClass {
public static int getDemoResource(Context context) {
return context.getResources().getColor(R.color.robo_red);
}
}
我注意到在构建目录中,仅在包 extendlibrary 中生成了一个 R 文件,但没有用于 baselibrary 的包。在名为 baselibrary 的包中手动创建 R 文件会导致测试通过。关于我可能做错了什么的任何想法。
R class 缺失,直到您提供一个 ;) 当您将有效的 R class 复制到预期的包时,尝试它是否也适用于您。
您必须更改复制任务中的路径以匹配您的包名称
afterEvaluate { project ->
android.libraryVariants.each { variant ->
// workaround for missing R class for aar dependencies
tasks.getByName("assemble${variant.name.capitalize()}").dependsOn copyAppcompat
// workaround for missing compilation of main sources
tasks.getByName("test${variant.name.capitalize()}") {
dependsOn "assemble${variant.name.capitalize()}"
}
}
}
task copyAppcompat(type: Copy) {
from 'build/generated/source/r/debug/com/example/core'
into 'src/test/java/android/support/v7/appcompat'
include 'R.java'
filter { line -> line.contains('package com.example.core;') ? 'package android.support.v7.appcompat;' : line }
}
这是一个依赖于其他库的示例项目 (aar) https://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar
这里是例子build.gradle
https://github.com/nenick/AndroidStudioAndRobolectric/blob/library-with-aar/core/build.gradle#L42