Java 在JUnit5测试方法中输入多个参数
我想为我的代码库提供“多态”测试用例。具体来说,Java 在JUnit5测试方法中输入多个参数,java,junit5,Java,Junit5,我想为我的代码库提供“多态”测试用例。具体来说,Graph接口将有多个实现,并且希望为所有接口重用测试代码(ALGraph,AMGraph,…) 我想沿着以下思路发展我的测试方法 @ParameterizedTest @MethodSource("graphFactory") // Note: JUnit 5 won't allow the following additional argument source @ValueSource(ints = {0, 3
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());
}
@ParameterizedTest
@MethodSource(“graphFactory”)
//注意:JUnit5不允许以下附加参数源
@ValueSource(ints={0,31415,-31415})
void testInsertDeleteNode(图g,整数v){
g、 插入节点(新节点(v));
assertTrue(g.containsNode(新节点(v));
assertEquals(1,g.顶点().大小());
g、 删除节点(新节点(v));
assertFalse(g.containsNode(新节点(v));
assertEquals(0,g.顶点().大小());
}
但是JUnit的构建方式阻止了我完成这个计划
所以基本上我想为我的测试提供多个参数的笛卡尔积。使用现成的参数提供程序(ValueSource
,NullSource
,…)是否可以实现这一点,或者我是否需要借助@MethodSource
)强制设置自定义的参数提供程序?通过BeatGua13更新2020-10-07
从v1.0.0开始,@CartesianProductTest
作为JUnit5扩展包的一部分提供。有关详细信息,请访问
JUnit5样本
它不受开箱即用的支持,但是已经存在一个功能请求
在此处找到一个示例和概念验证解决方案:
@CartesianProductTest({“0”,“1”})
空三位(字符串a、字符串b、字符串c){
int value=Integer.parseUnsignedInt(a+b+c,2);
在你的例子中,你也可以考虑使用一个基于属性的测试框架。使用它的第一种方式与你的例子非常相似:
import net.jqwik.api.*;
import static org.junit.jupiter.api.Assertions.*;
@Property(generation = GenerationMode.EXHAUSTIVE)
void testInsertDeleteNode(
@ForAll("graphFactory") Graph g,
@ForAll("ints") 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());
}
@Provide
Arbitrary<Graph> graphFactory() {
return Arbitraries.of(new ALGraph(), new AMGraph());
}
@Provide
Arbitrary<Integer> ints() {
return Arbitraries.of(0, 31415, -31415);
}
因为您已经在使用JUnit 5平台,所以使用jqwik需要一个。检查查找相关的功能请求,在测试模板是否与我的“测试模板”等用途相关(在这种情况下,有用)JUnit Jupiter扩展是否用于实现此答案中的@ParameterizedTest
和@CartesianProductTest
——有关更多详细信息,请参阅JUnit 5用户指南:我所怀疑的,谢谢!在如此紧迫的期限内,我甚至不应该做单元测试。因为v1.0.0@CartesianProductTest
是可用的le作为JUnit 5扩展包的一部分:
interface GraphTest<G extends Graph> {
G createGraph();
@Property(generation = GenerationMode.EXHAUSTIVE)
default void testInsertDeleteNode(@ForAll("ints") Integer v) {
Graph g = createGraph();
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());
}
@Provide
default Arbitrary<Integer> ints() {
return Arbitraries.of(0, 31415, -31415);
}
}
class ALGraphTest implements GraphTest<ALGraph> {
@Override
public ALGraph createGraph() {
return new ALGraph();
}
}
class AMGraphTest implements GraphTest<AMGraph> {
@Override
public AMGraph createGraph() {
return new AMGraph();
}
}