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

标签 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 异常,因为我无法获取实际值。任何帮助将不胜感激。谢谢。

最佳答案

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

想想您同时拥有英语和法语字符串资源的情况——它应该解析哪个值?英国人还是法国人?在运行纯 JUnit 测试时,测试运行器不知道这些资源或如何解决它们。

您可以考虑几种方法。

选项 1:不用担心值
要问的第一个问题是您到底在测试什么以及为什么。

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

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

选项 2:运行插桩测试
如果您真的想测试是否加载了正确的值,那么您需要使用实际的 Android 框架运行某种仪器测试。

这些测试在物理设备或模拟器上运行。

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

选项 3:使用 Robolectric
作为插桩测试和纯 Java 测试之间的一种中间地带,Robolectric提供了一个“假”的Android SDK,可以解析资源,创建Activity等。

关于android - 如何在单元测试中读取 Android 资源文件值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51408851/

相关文章:

java - JUnit 的@Ignore

Android - MockitoJUnitRunner - 光标 getCount 总是返回 0

java - Eclipse 类路径条目仅用于测试

c++ - 如何使用谷歌测试测试一些代码?

scala - Mockito:对重载定义的引用不明确

java - Mockito.any() 通过泛型接口(interface)

android - StaggeredGridView 在滚动时卡在中间

java - Android 检查 WIFI 状态(断开连接或用户更改 WIFI)如何标记它?

android - android中的画廊类型 ScrollView

java - Android - 从 mp3 流中读取 ID3 标签