【问题标题】:"android.content.res.Resources$NotFoundException:" in Robolectric testRobolectric 测试中的“android.content.res.Resources$NotFoundException:”
【发布时间】:2014-07-16 02:33:59
【问题描述】:

如何解决此 Robolectric 测试中的上述错误?请注意,我在 Android Studio Beta 0.8.2 中运行我的测试。我在测试中发现了 Gradle Robolectric Resources NotFoundException,这表明我需要使用 @Config 注释来指定 AndroidManifest。但是,Android Studio 通过将构建类型中的内容与main 合并来生成最终清单。那么还有什么其他的建议可以解决这个错误呢?

@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {

    private MainActivity mActivity;

    @Before
    public void setUp() {
        mActivity = Robolectric.buildActivity(MainActivity.class).create().visible().get();
    }

    @Test
    public void testActivityNotNull() {
        assertThat(mActivity).isNotNull();
    }

    @Test
    public void testBaseballCardDetails() {
        FragmentManager fm = mActivity.getSupportFragmentManager();
        Fragment fragment = fm.findFragmentByTag(FragmentTags.EDIT_CARD);

        assertThat(fragment).isNotNull().isAdded().isVisible();
    }

}

堆栈跟踪:

android.content.res.Resources$NotFoundException: Resource ID #0x7f0d0002
    at android.content.res.Resources.getValue(Resources.java:1118)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2304)
    at android.content.res.Resources.getLayout(Resources.java:934)
    at android.support.v7.internal.view.SupportMenuInflater.inflate(SupportMenuInflater.java:115)
    at bbct.android.common.activity.MainActivity.onCreateOptionsMenu(MainActivity.java:84)

抛出异常的代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.getMenuInflater().inflate(R.menu.main, menu); // Line 84

    return super.onCreateOptionsMenu(menu);
}

【问题讨论】:

标签: android unit-testing robolectric


【解决方案1】:

这是一个known problem,也会影响ActionBarSherlock。您可以尝试使用来自 Github 问题的 sneuberger-amazon 的解决方案:

appcompat-v7 ActionBar 也会出现这种情况。

问题在于 Robolectric 提供了 ShadowMenuInflater,但它 不提供 ShadowSupportMenuInflater(这就是 appcompat 使用)。

您可以通过创建一个 org.robolectric.shadows.ShadowSupportMenuInflater 类的内容:

package org.robolectric.shadows;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

import android.support.v7.internal.view.SupportMenuInflater;
import android.view.Menu;

@Implements(SupportMenuInflater.class)
public class ShadowSupportMenuInflater extends ShadowMenuInflater {
    @Implementation
    public void inflate(int menuRes, Menu menu) {
        super.inflate(menuRes, menu);
    }
}

把这个类放在你自己项目的 org.robolectric.shadows 包中。 这样 Robolectric 在寻找阴影时会找到它 SupportMenuInflater,这样您的所有测试都会自动获取它 (无需为每个测试添加影子配置)。

或者/另外,您可以尝试在您的测试类中设置@Config(qualifiers = "v10")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多