JUnit参数化测试执行失败:No public static parameters方法异常求助
问题详情
运行JUnit Parameterized测试时触发以下错误:
java.lang.Exception: No public static parameters method on class com.nyl.group.bpbilling.util.ParsingUtilTest
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
测试代码如下:
@RunWith(Parameterized.class) public class ParsingUtilTest { @Test @Parameters public List<String[]> parameters() { return Arrays.asList( new String[]{"wrtier { type=file }; reader { type=DB, query=update asdsadsad }; processor { type = None }", "{wrtier={type=file}, reader={type=DB, query=update asdsadsad}, processor={type=None}}"}, new String[]{"wrtier { type=file };wrtier { type=file }", "{wrtier={type=file}, wrtier_1={type=file}}"}, new String[]{"", "{}"}, new String[]{"{}", ""}, new String[]{";wrtier { type=file }", "{}"}, new String[]{"{}", ";wrtier { type=file }"}, new String[]{"wrtier type=file}", "wrtier type=file}"}, new String[]{"{w={t=f}}", "w{t=f}"} ); } public void testParseStepSequenceInMapCnd1(String level, String expected ) throws Exception { CnfStep step = new CnfStep(); step.setStepParams(level); assertEquals(expected, ParsingUtil.parseStepSequenceInMap( step.getStepParams() ).toString()); } }
解决方法
报错原因清晰:JUnit Parameterized要求提供测试参数的方法必须是public static,且不能加@Test注解。你的代码存在三个问题,修正即可:
- 给参数方法
parameters()添加static修饰符 - 移除参数方法上的
@Test注解(仅保留@Parameters) - 给测试方法
testParseStepSequenceInMapCnd1添加@Test注解,否则测试不会被执行
修正后的代码:
@RunWith(Parameterized.class) public class ParsingUtilTest { @Parameters public static List<String[]> parameters() { return Arrays.asList( new String[]{"wrtier { type=file }; reader { type=DB, query=update asdsadsad }; processor { type = None }", "{wrtier={type=file}, reader={type=DB, query=update asdsadsad}, processor={type=None}}"}, new String[]{"wrtier { type=file };wrtier { type=file }", "{wrtier={type=file}, wrtier_1={type=file}}"}, new String[]{"", "{}"}, new String[]{"{}", ""}, new String[]{";wrtier { type=file }", "{}"}, new String[]{"{}", ";wrtier { type=file }"}, new String[]{"wrtier type=file}", "wrtier type=file}"}, new String[]{"{w={t=f}}", "w{t=f}"} ); } @Test public void testParseStepSequenceInMapCnd1(String level, String expected ) throws Exception { CnfStep step = new CnfStep(); step.setStepParams(level); assertEquals(expected, ParsingUtil.parseStepSequenceInMap( step.getStepParams() ).toString()); } }
内容的提问来源于stack exchange,提问作者kanna

