Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Robolectric R$color classDefNotFound_Android_Unit Testing_Robolectric - Fatal编程技术网

Android Robolectric R$color classDefNotFound

Android Robolectric R$color classDefNotFound,android,unit-testing,robolectric,Android,Unit Testing,Robolectric,我正在尝试使用以下设置测试android库com.android.tools.build:gradle:1.2.0,org.roblectric:roblectric:3.0-rc2,androidstudio 1.2-rc-3 在测试设置中,我间接引用了另一个库的R文件。该测试在androidstudio中运行良好,但从命令行运行会产生以下错误 java.lang.NoClassDefFoundError: robolectricdemo/com/baselibrary/R$color

我正在尝试使用以下设置测试android库
com.android.tools.build:gradle:1.2.0,org.roblectric:roblectric:3.0-rc2,androidstudio 1.2-rc-3
在测试设置中,我间接引用了另一个库的R文件。该测试在androidstudio中运行良好,但从命令行运行会产生以下错误

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$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)
                at org.robolectric.internal.bytecode.InstrumentingClassLoader.loadClass(InstrumentingClassLoader.java:98)
                ... 2 more
我已经在创建了我的代码的简化版本,其中包含以下重要的代码片段

测试类位于库扩展库中

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);
    }
}
此静态类位于library baselibrary中。

public class DemoStaticClass {

    public static int getDemoResource(Context context) {
        return context.getResources().getColor(R.color.robo_red);
    }
}

我注意到在build目录中,只在包extendlibrary中生成了一个R文件,但是没有用于baselibrary的包。在名为baselibrary的包中手动创建R文件会导致测试通过。任何关于我可能做错了什么的想法。

在您提供之前,R类将丢失;)当您将有效的R类复制到预期的包中时,如果它也适用,请尝试

您必须更改复制任务的路径以匹配包名称

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)的示例项目


这里的例子是
build.gradle

,在任何人阅读您的代码之前,Robolectric的版本是什么?为什么不在这里使用他们的样品呢?为什么您没有发布任何代码片段?应用程序是否正常运行?将添加请求的信息。我没有使用样本,因为它们不适用于我尝试测试的内容。您需要的确切测试是什么?基本上,我有一个调用引用库R文件的库方法的测试。您解决了这个问题吗?是的,我最终按照这些思路做了一些事情,然而,对于robolectric无法从盒子中取出这一点,我有点失望。我将目标更改为
为'src/test/java/android/support/v7/appcompat'
,因为应用程序模块在依赖库的情况下不喜欢主源中的附加R类。