编写单元测试Java中的继承类

iro*_*ein 5 java junit unit-testing

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

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

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

class EnhancedFoo extends Foo {
    @Override
    protected void someMethod(Bar bar) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

此外,即使该方法someOtherMethod没有被覆盖ExtendedFoo,我需要包括相关的测试,ExtendedFoo因为这仍然是合同,这个扩展的类和单元测试应该测试这个.

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

ern*_*t_k 3

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

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

    @Test
    public void void someOtherMethodBaz(Baz baz) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其扩展用于子类测试:

class EnhancedFooTest extends FooTest {
    @Test
    public void testSomeMethodBar() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在适当的情况下,甚至会声明一些测试类abstract,并通过具体测试类(具体类的测试)进行扩展。