如果我有多个 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 的所有测试分离到它们自己的文件中。即我有以下目录结构
- 来源
- ClassOne.java
- ClassTwo.java
- 测试
- ClassOneTests.java
- ClassTwoTests.java
不过,我要测试的 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 中覆盖以添加特定行为。
我有一些正在测试的 classes,我已经将这些 classes 的所有测试分离到它们自己的文件中。即我有以下目录结构
- 来源
- ClassOne.java
- ClassTwo.java
- 测试
- ClassOneTests.java
- ClassTwoTests.java
不过,我要测试的 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 中覆盖以添加特定行为。