java - 在 JUnit 4 中重用测试实现?

标签 java unit-testing junit4 code-reuse

我有一个接口(interface),例如:

public interface Thing {
  FrobResult frob(FrobInput); 
}

以及我正在尝试测试的该接口(interface)的几个实现(例如 NormalThingImmutableThingAsyncThing)。

我的许多测试方法实际上是为了确保正确实现接口(interface),因此在每个 Thing 实现中都是重复的。在 JUnit 3 中,一个常见的解决方案是创建一个基类(扩展 TestCase),然后每个实现类都将其子类化。但这是 JUnit 4 的正确方法吗?

(我相信)偏好升序的可能替代方案:

  1. 剪切并粘贴重复的测试方法。一点也不干,但我想在测试中不如在生产代码中那么令人担忧。

  2. 使用@Test 方法创建一个抽象类,并为每个实现测试类创建子类。 (在 JUnit 3 测试中很常见——这在 JUnit 4 中仍然是一种好方法吗?)

  3. 将常用的测试方法放入辅助类中,并在每次实现时调用它。 (组合而不是继承。)

执行#3 的最佳做法是什么?也许一个 @RunWith(Parameterized.class) 测试在每个实现中都被参数化了?还是有更好的方法来实现这一点?

最佳答案

是的,这是创建基类的正确方法,然后 JUnit4 中的每个实现类也将其子类化。

我更喜欢接口(interface)的基测试类是抽象的,即你的“替代”2,因为我在模仿测试代码的生产代码的继承层次结构方面取得了很好的经验。因此,如果您有接口(interface) I 和实现 S1S2S3,您创建抽象测试类 TestI 和测试类 TestS1TestS2TestS3 .

测试用例应该会说话,即讲故事。通过一如既往地仔细选择方法名称并仅使用干净的行为子类型,继承不会混淆这一点。

关于java - 在 JUnit 4 中重用测试实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13185566/

相关文章:

unit-testing - 如何在 Golang 中仅模拟特定方法

java - JMockit - java.lang.ClassCastException : java. lang.String 无法转换为组织

java - 为方法返回对象编写 junit 测试

Java string split() 正则表达式

android - Espresso 无法解析 Intent Activity - 单元测试抽象基本 Activity

java - 为什么我不能减少 ArrayList/LinkedList 中的所有元素

c++ - 隐藏免费功能

Java 不将失败方法视为分支结束

java - Hibernate Rest 状态码 : 200 but entity not saved

java - 如何限制java Controller 中多部分文件的大小