我有一个接口(interface),例如:
public interface Thing {
FrobResult frob(FrobInput);
}
以及我正在尝试测试的该接口(interface)的几个实现(例如 NormalThing
、ImmutableThing
、AsyncThing
)。
我的许多测试方法实际上是为了确保正确实现接口(interface),因此在每个 Thing
实现中都是重复的。在 JUnit 3 中,一个常见的解决方案是创建一个基类(扩展 TestCase
),然后每个实现类都将其子类化。但这是 JUnit 4 的正确方法吗?
(我相信)偏好升序的可能替代方案:
剪切并粘贴重复的测试方法。一点也不干,但我想在测试中不如在生产代码中那么令人担忧。
使用
@Test
方法创建一个抽象类,并为每个实现测试类创建子类。 (在 JUnit 3 测试中很常见——这在 JUnit 4 中仍然是一种好方法吗?)将常用的测试方法放入辅助类中,并在每次实现时调用它。 (组合而不是继承。)
执行#3 的最佳做法是什么?也许一个 @RunWith(Parameterized.class)
测试在每个实现中都被参数化了?还是有更好的方法来实现这一点?
最佳答案
是的,这是创建基类的正确方法,然后 JUnit4 中的每个实现类也将其子类化。
我更喜欢接口(interface)的基测试类是抽象的,即你的“替代”2,因为我在模仿测试代码的生产代码的继承层次结构方面取得了很好的经验。因此,如果您有接口(interface) I
和实现 S1
、S2
和 S3
,您创建抽象测试类 TestI
和测试类 TestS1
、TestS2
和 TestS3
.
测试用例应该会说话,即讲故事。通过一如既往地仔细选择方法名称并仅使用干净的行为子类型,继承不会混淆这一点。
关于java - 在 JUnit 4 中重用测试实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13185566/