Robolectric测试中的“android.content.res.Resources $ NotFoundException:”

时间:2014-07-16 02:33:59

标签: android unit-testing robolectric

如何修复此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);
}

1 个答案:

答案 0 :(得分: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")