Robolectric 3.0 - java.lang.NoClassDefFoundError:测试库模块时的android / support / v7 / appcompat / R $样式

时间:2015-06-23 03:56:06

标签: java android android-gradle build.gradle robolectric

我最近将java.lang.NoClassDefFoundError: android/support/v7/appcompat/R$styleable 2.4 升级到 3.0-rc3 ,经过大量的摔跤,我把它缩小到最后由于问题导致少数案例失败的错误:

Robolectrie 3.0

它通过99%的案例,但有一些因此而失败。我的应用程序的其他组件都以漂亮的颜色传递,我只看到它发生在我的模块中。

我查了一下,似乎问题源于R.java没有生成build.gradle文件。但是,似乎没有解决方案,除了一些对我不起作用的targetSDK黑客。我也尝试过编辑AppCompat并确保在清单中设置apply from: rootProject.file('src/build/groovy/android-library.gradle') dependencies { compile project(':myApplication') compile('com.application:player:') { exclude module: 'support-v4' } compile "com.android.support:support-v4:19.1.0" compile 'com.android.support:cardview-v7:21.0.+' compile "com.android.support:appcompat-v7:22.1.0" } 主题,但无济于事。

的build.gradle:

jqXHR

有人知道如何解决这个问题吗?它耗费了我很多时间!

3 个答案:

答案 0 :(得分:0)

Robolectric 3.0已经开始将几个影子类分成不同的工件。您可能只需要将shadows-support-v4添加为依赖项(同时保留*-v7的{​​{1}}依赖项。

答案 1 :(得分:0)

我遇到了同样的问题。

这就是我为修复它所做的。

假设您已包含以下库     support-v4,com.android.support.v7的appcompat lib,robolectric 3.0和junit以及对你正在测试的apkib的引用(根据sschuberth和该线程的其他贡献者)

假设被测活动是XXXActivity。 为了在我们的单元测试用例中填充我们的上下文 - 我们使用     Robolectric.buildActivity(XXXActivity.class).create().start().resume().get();

我把它改成了     Robolectric.buildActivity(XXXMockActivity.class).create().start().resume().get();

其中XXXMockActivity仅在调用super.onCreate()之前设置主题。

public class XXXMockActivity extends XXXActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Theme_AppCompat_Light_DarkActionBar);
        super.onCreate(savedInstanceState);
    }
}

答案 2 :(得分:0)

我只是忽略了测试 - 似乎没有解决这个问题的方法。正如有人评论我原来的问题,这是一个未解决的问题:github.com/robolectric/robolectric/issues/1796

如果你遇到同样的问题,我不会花太多时间在上面。