java - 在 Java 中为继承的类编写单元测试

标签 java unit-testing junit

考虑以下 Java 中的简单类层次结构

class Foo {
    protected void someMethod(Bar bar) {
        ...
    }

    protected void someOtherMethod(Baz baz) {
        ...
    }
}

class EnhancedFoo extends Foo {
    @Override
    protected void someMethod(Bar bar) {
        ...
    }
}

我现在开始为这两个类编写 JUnit 单元测试。由于方法 someMethod 的契约对于两个类都是相同的,我需要对两个类基本上完全相同的测试方法(关于 someMethod 方法),这导致代码重复。为具有多个覆盖方法的更丰富的类层次结构执行此操作,感觉继承对可测试性不利。

此外,即使方法 someOtherMethod 没有在 ExtendedFoo 中被重写,我也需要包括对 ExtendedFoo 的相关测试,因为那仍然是契约(Contract)和这个扩展类和单元测试应该测试这个。

在 Java 中是否有其他组织层次结构的方法更利于可测试性?是否有一些 JUnit 结构可以帮助缓解这个问题?

最佳答案

当我们有一个非常相似的场景时,我们使用的一种方法是也重用 est 类:

class FooTest {
    @Test
    public void testSomeMethodBar() {
        ...
    }

    @Test
    public void void someOtherMethodBaz(Baz baz) {
        ...
    }
}

并为子类测试扩展它:

class EnhancedFooTest extends FooTest {
    @Test
    public void testSomeMethodBar() {
        ...
    }
}

JUnit 将运行这个特定的覆盖测试方法,以及 FooTest 中的其他默认测试。这消除了不必要的重复。

在适当的情况下,一些测试类甚至被声明为abstract,并由具体测试类扩展(针对具体类的测试)。

关于java - 在 Java 中为继承的类编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52962397/

相关文章:

挂载文件系统时接收通知的java api

angularjs - Protractor 不从自动完成搜索地址中选择第一个元素

gradle - Spek插件无法在运行时中发现方法,并引发异常:NoSuchMethodError Exception

java - Mockito 没有模拟成员变量方法的返回值

java - 自动为 Junit 创建数据

javascript - 在 Javascript 中简单地异或加密并在 Java 中解密

java - 将返回的 int[] 逐项分解为单独的整数变量

c# - 代码覆盖率分析显示 100% 的覆盖率,而大多数类都缺少覆盖率

java - 使用 GRPC 时 SSL 解密错误

unit-testing - 重构时如何确保不破坏测试代码?