如何在单元测试中读取Android资源文件值

时间:2018-07-18 18:35:09

标签: android unit-testing mockito

我有一个数组资源。我想进行测试以读取和解析xml资源中的值。这是代码。

<string-array name="names">
    <item>Name1[?]200</item>
    <item>Name2[?]125</item>
    <item>Name3[?]142</item>
</string-array>

我想捕获上面的字符串资源并像下面的测试案例一样进行解析。但是我无法达到。

@RunWith(MockitoJUnitRunner.class)
public class ReadAndParseNamesTest {

@Mock
private Context mockApplicationContext;
@Mock
private Resources mockContextResources;

@Test
public void readAndParseNamesTest() {

    MockitoAnnotations.initMocks(this);

    when(mockApplicationContext.getResources()).thenReturn(mockContextResources);

     String[] marray = {"mock main class"};
    when(mockContextResources.getStringArray(R.array.allah_names))
            .thenReturn(marray);
    for(int i = 0;i<marray.length;i++){
        String[] deger = marray[i].split("[?]");
        System.out.println("Deger "+i+": "+deger[0] + " "+ deger[1]);
    }
  }
}

我遇到java.lang.ArrayIndexOutOfBoundsException: 1异常,因为我无法获得实际值。任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:4)

您不能使用简单的模拟来检索资源值。

考虑一下同时拥有英语和法语字符串资源的情况-它应该解析哪个值?是英语还是法语?在运行纯JUnit测试时,测试运行程序不了解诸如此类的资源或如何解决它们。

您可以考虑几种方法。

选项1:不用担心值
首先要问的是您正在测试什么,为什么?

您可能不需要测试Android框架是否正确加载了资源值。该框架具有自己的测试套件,并且资源加载通常是可靠的。

如果您可以确信资源值正确,则只需验证您正在使用正确的字符串ID(getStringArray())来调用R.string.allah_names

选项2:运行检测测试
如果您确实想测试是否已加载正确的值,则需要使用实际的Android框架运行某种检测化的测试。

这些测试在物理设备或仿真器上运行。

如果您想走那条路,请查看Build instrumented unit tests documentation

选项3:使用Robolectric
作为在工具化测试和纯Java测试之间的一种中间立场,Robolectric提供了一种“伪造”的Android SDK,可以解析资源,创建活动等。