我有一个数组资源。我想进行测试以读取和解析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
异常,因为我无法获得实际值。任何帮助将不胜感激。谢谢。
答案 0 :(得分:4)
您不能使用简单的模拟来检索资源值。
考虑一下同时拥有英语和法语字符串资源的情况-它应该解析哪个值?是英语还是法语?在运行纯JUnit测试时,测试运行程序不了解诸如此类的资源或如何解决它们。
您可以考虑几种方法。
选项1:不用担心值
首先要问的是您正在测试什么,为什么?
您可能不需要测试Android框架是否正确加载了资源值。该框架具有自己的测试套件,并且资源加载通常是可靠的。
如果您可以确信资源值正确,则只需验证您正在使用正确的字符串ID(getStringArray()
)来调用R.string.allah_names
。
选项2:运行检测测试
如果您确实想测试是否已加载正确的值,则需要使用实际的Android框架运行某种检测化的测试。
这些测试在物理设备或仿真器上运行。
如果您想走那条路,请查看Build instrumented unit tests documentation。
选项3:使用Robolectric
作为在工具化测试和纯Java测试之间的一种中间立场,Robolectric提供了一种“伪造”的Android SDK,可以解析资源,创建活动等。