当前位置: 首页 > 知识库问答 >
问题:

在JUnit4中重用测试实现?

易京
2023-03-14

我有一个接口,例如:

public interface Thing {
  FrobResult frob(FrobInput); 
}

以及我试图测试的该接口的几个实现(例如normalthingimmutablethingAsyncthing)。

我的许多测试方法实际上是为了确保接口被正确实现,因此在每个事物实现中都是重复的。在JUnit3中,一个常见的解决方案是创建一个基类(扩展TestCase),然后由每个实现类对其进行子类化。但是对于JUnit4来说,这是正确的方法吗?

在(我相信)优先顺序的升序中可能的选择:

>

  • 剪切'n'粘贴重复的测试方法。一点也不枯燥,但我想测试中的担忧比生产代码中的担忧要少。

    @test方法创建一个抽象类,并为每个实现测试类子类化它。(通常在JUnit3测试中看到--在JUnit4中,这仍然是一种好的方法吗?)

    将常见的测试方法放入帮助器类中,并在每个实现上调用它。(组合而不是继承。)

    做第3题的最佳实践是什么?也许是@runwith(parameterized.class)测试在每个实现中都参数化了?或者有没有更好的方法来完成这一点?

  • 共有1个答案

    欧阳声
    2023-03-14

    是的,正确的方法是创建一个基类,然后由JUnit4中的每个实现类子类。

    我更喜欢接口的基测试类是抽象的,即您的“替代”2,因为我在模仿来自测试代码的生产代码的继承层次结构方面有很好的经验。因此,如果您有接口i和实现s1s2s3,那么您将创建抽象测试类testi和测试类tests1tests2tests3

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

     类似资料:
    • 在JUnit 4中,通过使用注释很容易跨一堆类测试不变量。关键是一组测试正在针对单个参数列表运行。 如何在JUnit 5中复制这一点,而不使用JUnit-vintage? 不适用于测试类。听起来可能是合适的,但该注释的目标也是一个方法。 此类 JUnit 4 测试的一个示例是:

    • 主要内容:1 Junit分类测试的介绍,2 在Maven中进行分类测试,3 在Gradle中进行分类测试,4 在SBT中进行分类测试,5 分类测试的典型用法1 Junit分类测试的介绍 从给定的一组测试类中,类别运行器仅运行用@IncludeCategory批注指定的类别或该类别的子类型进行批注的类和方法。类或接口都可以用作类别。子类型有效,因此,如果您说@IncludeCategory(SuperClass.class),则会运行标记为@Category({SubClass.class})的测

    • 主要内容:1 概述,2 @Test注释上的超时参数(适用于测试方法),3 超时规则(适用于测试类中的所有测试用例),4 使用JUnit Foundation进行全局超时管理1 概述 在此示例中,我们将了解测试完成所花费的时间是否超过定义的“timeout”,将抛出TestTimedOutException并将测试标记为失败。 “runaway”或花费太长时间的测试可能会自动失败。有两种方法可以实现此行为: @Test注释上的超时参数(适用于测试方法) 使用JUnit Foundation进行全局

    • 主要内容:1 概述,2 JUnit 4异常测试示例,3 结论1 概述 在本指南中,我们将学习如何测试具有意外条件的方法引发的异常。 2 JUnit 4异常测试示例 有三种方法可以处理异常。 预期的异常 ExpectedException规则 Try/Catch Idiom 2.1 预期的异常 您如何验证代码是否按预期抛出异常?验证代码能否正常完成很重要,但是确保代码在异常情况下的行为也很重要。例如: 此代码应引发IndexOutOfBoundsExcept

    • 主要内容:1 概述,2 创建简单的Maven项目,3 项目包装结构,4 更新pom.xml文件中的JUnit依赖关系,5 创建LoginService.java和LoginServiceTest.java,,6.创建UserService.java和UserServiceTest.java,7 创建测试套件,8 结论1 概述 在本指南中,我们将学习如何一次运行多个测试类。将Suite用作运行程序可以使您手动构建一个包含许多类测试的套件。它等效于JUnit 3.8.x静态Test suite()方

    • 主要内容:1 参数化测试的介绍,2 使用@Parameter进行字段注入而不是构造函数,3 使用单个参数进行测试,4 识别单个测试用例1 参数化测试的介绍 自定义流道参数化实现参数化测试。运行参数化测试类时,将为测试方法和测试数据元素的叉积创建实例。 例如,要测试斐波那契函数,请编写: FibonacciTest的每个实例都将使用二元参数构造函数和方法中的数据值构造 @Parameters 。 2 使用@Parameter进行字段注入而不是构造函数 也可以将数据值直接注入字段中,而无需使用@Pa