![](/img/trans.png)
[英]java.lang.NoSuchMethodError: java.lang.System.arraycopy using XmlPullParser with Robolectric
[英]Android KXmlParser "NoSuchMethodError: java.lang.System.arraycopy([CI[CII)V"
我在 Spock 规范(无 Robolectric)中使用 KXmlParser 来解析 Android strings.xml 文件。 我间歇性地得到以下跟踪:
java.lang.NoSuchMethodError: java.lang.System.arraycopy([CI[CII)V
at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1509)
at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:1001)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:448)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
知道有什么问题吗?
这是我的 ext 属性:
minSdkVersion = 19
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.2'
这是代码片段:
try (FileInputStream in = new FileInputStream("app/src/main/res/values/strings.xml")) {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(in, null);
AndroidStringResource resource = null;
int eventType = parser.getEventType();
while (eventType != parser.END_DOCUMENT) {
eventType = parser.next();
if (eventType == parser.START_TAG) {
if (parser.getName().equals("string")) {
resource = new AndroidStringResource();
resource.name = parser.getAttributeValue(null, "name");
resource.context = parser.getAttributeValue(null, "context");
String maxLengthStr = parser.getAttributeValue(null, "maxLength");
resource.maxLength = (maxLengthStr == null) ? -1 : Integer.parseInt(maxLengthStr);
}
} else if (eventType == parser.TEXT) {
if (resource != null) {
resource.value = parser.getText();
}
} else if (eventType == parser.END_TAG) {
if (parser.getName().equals("string")) {
if (!resourceNameToServerKeyMap.containsKey(resource.name)) {
androidStringResourceMap.put(resource.name, resource);
}
resource = null;
}
}
}
}
请注意,我正在向 strings.xml 中的元素添加自定义 XML 属性。 下面是一个例子:
<resources>
<string name="app_name" maxLength="30">myapp</string>
</resources>
MVCE 可重现的测试用例在这里是可用的。
问题是由于我使用 Spock 框架在 Android VM 之外的 JVM 中运行测试引起的。 这意味着我的测试无法使用 Android 运行时提供的某些代码。 解决方案是使用 robolectric,以便它可以提供 Android 运行时的影子实现,并且仍然允许我的测试在 Android VM 之外的 JVM 中运行。 一旦我将 spock 测试更改为使用 robolectric,一切都很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.