java - 在 JUnit 5 测试方法中输入多个参数
问题描述
我想为我的代码库提供“多态”测试用例。具体来说,一个接口将有多个实现,Graph
并且希望为所有这些实现重用测试代码(ALGraph
, AMGraph
, ...)。
我想按照以下思路开发我的测试方法
@ParameterizedTest
@MethodSource("graphFactory")
// Note: JUnit 5 won't allow the following additional argument source
@ValueSource(ints = {0, 31415, -31415})
void testInsertDeleteNode(Graph g, Integer v) {
g.insertNode(new Node<>(v));
assertTrue(g.containsNode(new Node<>(v)));
assertEquals(1, g.vertices().size());
g.deleteNode(new Node<>(v));
assertFalse(g.containsNode(new Node<>(v)));
assertEquals(0, g.vertices().size());
}
但是 JUnit 的构建方式阻止了我完成这个方案。
所以基本上我想为我的测试提供多个参数的笛卡尔积。开箱即用的参数提供者(ValueSource
, NullSource
, ...)是否可以做到这一点,或者我是否需要借助 来强制设置自定义参数@MethodSource
?
解决方案
通过 beatngu13 更新 2020-10-07
从 v1.0.0 开始,@CartesianProductTest
作为 JUnit 5 的JUnit Pioneer扩展包的一部分提供。在https://junit-pioneer.org/docs/cartesian-product查找详细信息
JUnit 5 示例
它不支持开箱即用 - 但在https://github.com/junit-team/junit5/issues/1427已经存在一个功能请求
在此处查找示例和概念验证解决方案:https ://github.com/junit-team/junit5-samples/tree/master/junit5-jupiter-extensions
@CartesianProductTest({"0", "1"})
void threeBits(String a, String b, String c) {
int value = Integer.parseUnsignedInt(a + b + c, 2);
assertTrue((0b000 <= value) && (value <= 0b111));
}
@CartesianProductTest
@DisplayName("S ⨯ T ⨯ U")
void nFold(String string, Class<?> type, TimeUnit unit, TestInfo info) {
assertTrue(string.endsWith("a"));
assertTrue(type.isInterface());
assertTrue(unit.name().endsWith("S"));
assertTrue(info.getTags().isEmpty());
}
static CartesianProductTest.Sets nFold() {
return new CartesianProductTest.Sets()
.add("Alpha", "Omega")
.add(Runnable.class, Comparable.class, TestInfo.class)
.add(TimeUnit.DAYS, TimeUnit.HOURS);
}
产生一个测试计划,如:
推荐阅读
- oracle-apex - 在 Oracle Apex 中设置自动时区时出错
- javascript - 在 Node.js 中同步调用以解析请求并在处理请求后发送响应
- amazon-web-services - 使用 Cloud Formation 模板创建 AWS Athena View
- angular - 核心、共享和功能模块中应该包含哪些内容?
- c++ - 尝试在循环中动态初始化 3 维向量时出现分段错误
- javascript - 如何将单个键值对对象转换为具有键值对的对象数组?
- php - 验证ajax,如果数据不存在禁用提交按钮
- python - 时期的张量流样本大小
- python - Tkinter 按钮和多线程?
- java - 从具有 TABLE_PER_CLASS 继承的多对多关系中删除时,Hibernate 无法确定集合所有者