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();
    }
}