我有一个界面,例如:
public interface Thing {
FrobResult frob(FrobInput);
}
以及我正在尝试测试的该接口的几个实现(例如NormalThing
, ImmutableThing
) 。AsyncThing
我的许多测试方法实际上都是为了确保接口正确实现,因此在每个Thing
实现中都是重复的。在 JUnit 3 中,一个常见的解决方案是创建一个基类(扩展TestCase
),然后由每个实现类对其进行子类化。但这是 JUnit 4 的正确方法吗?
(我相信)按偏好升序排列的可能替代方案:
剪切'n'粘贴重复的测试方法。一点也不干,但我想测试中的担忧不如生产代码中的担忧。
创建一个带有
@Test
方法的抽象类,并为每个实现测试类对其进行子类化。(在 JUnit 3 测试中很常见——在 JUnit 4 中这仍然是一个好方法吗?)将常用的测试方法放入一个辅助类中,并在每个实现中调用它。(组合而不是继承。)
做#3的最佳实践是什么?也许@RunWith(Parameterized.class)
是每个实现都参数化的测试?还是有更好的方法来实现这一点?