我是一个相对新手的Java程序员,目前遇到了一些难题。好了,先放下免责声明,下面是我的问题:
我有一个XML文件,里面包含了一个大量视频文件名和相应的参考ID字符串列表。这个XML文件长这样:
<testdata>
<testcase displayName="video1" refId="vid1xxyyzz" />
<testcase displayName="video2" refId="vid2aabbcc" />
.
.
<testcase displayName="video499" refId="vid499ffoooo" />
</testdata>
我使用XMLBeans将XML模式转换为类,然后按照这里记录的方法,将数据导入到几个数组中:http://docs.oracle.com/javase/tutorial/reflect/special/arraySetGet.html
// File import:
File refIdFile = new File("C:\testdata.xml");
DisplayNameReferenceIdDoc = DisplayNameReferenceIdDocument.Factory.parse(refIdFile);
displayNameReferenceId = DisplayNameReferenceIdDoc.getDisplayNameReferenceId();
tests = displayNameReferenceId.getTestcaseArray();
// Multi-dimensional array get/set:
matrix = Array.newInstance(String.class, 2, tests.length);
Object row0 = Array.get(matrix, 0);
Object row1 = Array.get(matrix, 1);
for (int i = 0; i < tests.length; i++){
displayName = tests[i].getDisplayName();
refId = tests[i].getRefId();
Array.set(row0, i, displayName);
Array.set(row1, i, refId);
}
这个操作发生在我的测试类中的一个@Parameterized
方法中,它必须返回一个集合。以下是完整的代码:
@RunWith(Parameterized.class)
public class ValidateDisplayNameReferenceIdTest {
static DisplayNameReferenceIdDocument DisplayNameReferenceIdDoc;
static DisplayNameReferenceId displayNameReferenceId;
static DisplayNameReferenceId.Test[] tests;
static String displayName;
static String refId;
static Object matrix;
@Parameterized.Parameters(name="{index}: {0}")
public static Collection<Object> getTestParameters() throws IOException, XmlException {
File refIdFile = new File("C:\testdata.xml");
DisplayNameReferenceIdDoc = DisplayNameReferenceIdDocument.Factory.parse(refIdFile);
displayNameReferenceId = DisplayNameReferenceIdDoc.getDisplayNameReferenceId();
tests = displayNameReferenceId.getTestArray();
matrix = Array.newInstance(String.class, 2, tests.length);
Object row0 = Array.get(matrix, 0);
Object row1 = Array.get(matrix, 1);
for (int i = 0; i < tests.length; i++){
displayName = tests[i].getDisplayName();
refId = tests[i].getRefId();
Array.set(row0, i, displayName);
Array.set(row1, i, refId);
}
System.out.println("tweet");
return Arrays.asList(matrix); // NOT SURE ABOUT THIS!
}
private String displayNameInput;
private String refIdExpected;
public ValidateDisplayNameReferenceIdTest(String input, String expected ) {
displayNameInput = input;
refIdExpected = expected;
}
@Test
public void test() throws IOException {
// send the API URL with 'displayNameInput', validate result for 'refIdExpected'
URLConnection connection = new URL(url1 + displayNameInput + url2 + token).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(response, writer);
String responseString = writer.toString();
System.out.println(responseString);
//Here goes something like assert(response.contains(refIdExpected));
}
}
当我按原样运行时,会出现
java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
的错误。我认为可能是数据结构过于复杂,但现在已经建立了这种方式并成功地获取了数据元素,我不知道该如何重新构建。有人看出我在这里做错了什么吗?
下面是完整的异常信息:
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.junit.runners.Parameterized$TestClassRunnerForParameters.createTestUsingConstructorInjection(Parameterized.java:186)
at org.junit.runners.Parameterized$TestClassRunnerForParameters.createTest(Parameterized.java:181)
at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:244)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:241)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runners.Suite.runChild(Suite.java:127)
at org.junit.runners.Suite.runChild(Suite.java:26)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:202)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
static Object matrix;
。同时也添加了异常处理。 - kyoobParameterized.class
,但它只到第65行。让我看看我的 JUnit 库是否最新... - kyoobParameterized.class
:private Object createTestUsingConstructorInjection() throws Exception {return getTestClass().getOnlyConstructor().newInstance(fParameters);}
。 - kyoob@Before
注释的设置方法,然后填充一个Map<String, String>
呢? 如果您的担忧是您只想读取和填充一次,那么在读取文件之前,请先检查if(map.isEmpty())
。 - Dan Temple