考虑以下 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/