如何在Parameterized参数化测试中传入Student等自定义对象作为参数
JUnit 5 参数化测试传入自定义Student对象方案
JUnit 5 参数化测试完全支持传入自定义对象作为参数,你之前了解的「仅支持字符串和基本类型」是对@ValueSource这类简单参数源的限制,换用以下方案即可实现需求:
推荐方案:使用@MethodSource参数源
这是最灵活的传入复杂对象的方案,直接通过工厂方法生成你需要的Student测试用例对象即可,改造后的完整代码示例如下:
// 替换原有@Test注解,改用参数化测试注解 @ParameterizedTest @MethodSource("provideTestStudents") void add(Student testStudent) { studentSet2.add(testStudent); assertAll( ()->assertThat(studentSet2).contains(testStudent), ()->assertThat(studentSet2).hasSize(1), ()->assertThat(studentSet2.iterator().next()).isEqualTo(testStudent), ()->assertThat(studentSet2.toArray(new Student[1])).containsOnly(testStudent) ); } // 提供测试用Student对象的工厂方法 static Stream<Student> provideTestStudents() { return Stream.of( new Student("student5", LocalDate.of(2000,5,12), "none"), new Student("student6", LocalDate.of(2001,3,15), "class1"), // 可在此处添加任意多需要测试的Student用例 new Student("student7", LocalDate.of(1999,10,9), "class2") ); }
注意事项
- 提供参数的工厂方法必须用
static修饰,方法名要和@MethodSource注解里的配置值完全对应 - 如果每个测试用例需要传入多个参数,可以将返回值改为
Stream<Arguments>,通过Arguments.of(参数1, 参数2)组装多组参数
其他可选方案
如果你的测试用例参数可以通过字符串反序列化得到,也可以用@CsvSource+自定义参数转换器的方式实现,但灵活性远低于@MethodSource,仅适合测试用例可以简单用文本枚举的场景。
内容的提问来源于stack exchange,提问作者Imatabil
相关产品推荐
相关产品推荐

