JUnit5:测试多个类而不重复代码

Joe*_*oey 2 java junit5

我已经用 Java 构建了自己的堆栈实现,如下所示:

有一个接口“Stack”,它提供了基本功能(pop、push、peek 等)。然后我有 2 个具体的类,一个借助数组,另一个带有链表(在这种情况下如何并不重要)。

现在我的问题是:我想用 JUnit5 测试这个,因为你无法实例化接口,所以我必须为带有数组的类测试每个函数一次,为带有链表的类测试一次,所以代码不必要地长。有没有一种方法可以测试接口的所有功能或类似的东西?因为如果现在添加第三个实现,我就必须再次重写它。

我已经尝试过“ParameterizedTests”,但没有取得任何进展。

我很乐意提供帮助!

Mar*_*ipp 5

测试接口将是另一种可能性。您可以将测试定义为接口的默认方法,并在每个 Stack 实现中实现该接口一次。每个实现都可以添加额外的测试等。

interface StackContractTests {

    Stack newEmptyStack();

    @Test
    default void popsWhatWasLastPushed() {
        Stack stack = newEmptyStack();
        stack.push("foo");
        assertEquals("foo", stack.pop());
    }

    @Test
    default void cannotPopFromEmptyStack() {
        Stack stack = newEmptyStack();
        assertThrows(EmptyStackException.class, stack::pop);
    }
}

public class ArrayListBasedStackTests implements StackContractTests {
    @Override
    public Stack newEmptyStack() {
        return new ArrayListBasedStack();
    }
}

public class LinkedListBasedStackTests implements StackContractTests {
    @Override
    public Stack newEmptyStack() {
        return new LinkedListBasedStack();
    }
}
Run Code Online (Sandbox Code Playgroud)