我一直在设置一些合同 JUnit 4 测试(遵循回答这个问题的建议) - 例如,如果我有一个接口(我在示例中包含了泛型,因为我在我的项目中使用它们) - 但是,这个是一个显着简化的示例:
public interface MyInterface<T> {
public T myMethod();
}
我可以创建一个抽象的合同测试 - 例如:
public abstract class AbstractMyInterfaceTest<T> {
private final MyInterface<T> _impl;
// plus, store stuff to test against;
public AbstractMyInterfaceTest(MyInterface<T> impl, ... stuff to test against){
_impl = impl;
// stuff to test against...
}
@Test
public void testMyMethod(){
// test some stuff...
}
}
...并为每个实现(我正在运行@RunWith(Parameterized.class)
)扩展这个抽象测试类。我还将一些变量传递给抽象测试类来测试接口的实现。
然而,实际上,一些接口返回的对象是其他接口的实现,我希望能够使用该接口的抽象合约类来测试这个实现(......并针对相关变量)。例如,一个方法MyInterface
可能返回一个迭代器——它是一个接口。我有一个单独的AbstractIteratorTest
,它针对一组值运行 Iterator 的合同测试,并且我想检查实现Iterator
返回的返回值是否通过了预期的一组值MyInterface
的合同测试。AbstractIteratorTest
目前,我将以下内容添加到抽象测试类中:
// N.b. not setting @Test - so doesn't run all tests twice...
public void runTests(){
testMyMethod();
// etc.
}
但是,这不会独立运行每个测试(例如,setUp()
在每个测试方法之前运行),因此如果这些合同测试期望每个测试的实现处于特定状态,则会出现问题。(一个具体的例子是测试Iterator
接口的实现,其中每个测试方法都可以改变被测试的状态Iterator
)
有没有更好的方法来做到这一点,也许是利用 JUnit 4 中的特性?
我已经看到有关@RunWith(Suite.class)
注释的内容,但这似乎是关于从单个测试类运行多个测试类,并且不允许您将变量传递到正在运行的不同测试类中。可能有一种方法可以使用它 Suite
来解决我的问题,但我不确定它是什么......