如果我有多个 JUnit 测试 类,但它们共享大量设置,有没有办法重新使用这些设置代码?

If I have multiple JUnit test classes, but they share a large amount of setup, is there a way to resuse some of this setup code?

我有一些正在测试的 classes,我已经将这些 classes 的所有测试分离到它们自己的文件中。即我有以下目录结构

不过,我要测试的 classes 数量比这多得多。我已经开始为这些 class 中的许多编写测试,并且我意识到设置中有很多代码在它们之间是相同的。我希望能够重用这段代码,既可以减少编写更多测试所需的时间,也可以在我最终对代码库进行修改的情况下,我希望在测试中只有一个点改变,而不是几十个几乎相同的模拟实例化。

我的代码布局示例如下:

public class ClassOneTests {
    //Declare global variables that are dependencies for the test
    AClass var1;
    // etc...

    ClassOne testThis;

    @Before
    public void setUp() throws Exception {
        //instantiate and populate the dependencies
        var1 = new AClass();
        // etc...

        testThis.setDependencies(var1, //And other dependencies....);
    }

    @Test
    public void aTest() {
        //Do test stuff
        Var result = testThis.doStuff();
        Assert.NotNull(result);
    }

    // etc...
}

这意味着我的声明和 setUp 方法中的大部分内容在我的 class 测试中是重复的。

我已经部分解决了这个问题,方法是让一个 GenericTestSetup.java 完成所有这些设置,然后每个 ClassXTest.java 扩展它。问题在于每个 ClassXText.java 文件所特有的几个 classes,但在每个方法中都使用了。因此,在上面的示例中,AClass 是一个特定于 ClassOneTests 的变量。当我执行 ClassTwoTests 时,我有一堆共享变量,但是我有 BClass 而不是 AClass,例如。

我遇到的问题是我无法声明两个 @Before 标记,一个在 GenericTestClass 中用于通用设置,另一个在 ClassXTest class 中(如果 ClassXTest 中的任何对象)依赖于 GenericTestClass 中的某些东西,因为您不能保证执行顺序。

总而言之,有没有一种方法可以让这个通用测试设置用于多个 class 测试,但也有针对每个特定 class 的另一种设置方法,保证 运行 设置通用对象后?


编辑:有人建议我的问题是这个问题的重复:Where to put common setUp-code for differen testclasses?

我认为它们很相似,但这个问题要求在政策方面采用更通用的方法,我有一组更具体的要求,并询问如何实际实施。另外,none 那里的答案实际上给出了关于实现的正确答案,这是我需要的,所以它们对我没有用。

当重载增加复杂性时我通常会做什么,我使用,我称之为Logic classes... 基本上 class 使用静态方法获取需要初始化的参数,并设置它们。

Logic.init(param1, param2)

而且我通常只使用一个@Before 和不同的逻辑方法。 优点是代码可能会在相似的初始化之间共享,并且您可以在 Logic class 本身中重用代码。例子 Logic.init(param1,param2,param3) 可以调用 Logic.init(param1,param2),你可以在不同的@Before 方法中使用不同的变体。

编辑: 我不知道是否有模式或与此类解决方案相关的名称。如果有我也想知道名字:).

您可以使用模板方法模式。泛型 class 中的 @before 方法调用同一 class 中的受保护方法,该方法为空,但可以在实现 classes 中覆盖以添加特定行为。