java - 最佳实践 : Testing Interface Contract Compliance?

标签 java testing interface junit

假设定义了接口(interface)

interface Foo {
  int getBaz();
  void doBar();
}

进一步假设合约规定每次调用 doBar 时 baz 都会递增。 (好吧,这是一段人为的代码,但请坚持在这里)

现在我想提供一个我可以提供给 Foo 实现者的单元测试,以便他们可以验证他们是否满足所有契约(Contract)条件。

class FooTest {
  protected Foo fooImpl;

  @Test
  public void int testBazIncrement()
  {
    int b = fooImpl getBaz();
    fooImpl.doBar();
    Assert.assertEquals( b+1, fooImpl.getBaz();
  }
}

让 Foo 的实现者可以使用测试的最佳实践是什么?在我看来,他们需要一种机制来调用 FooTest 并提供 Foo 或 FooFactory 来构造 Foo 实例。此外,如果有很多测试(想想大接口(interface)),那么我想将所有这些测试放在一个 FooTest 类中。

是否有关于如何实现此类测试的最佳实践?

最佳答案

这是依赖注入(inject)的教科书示例。如果您使用 Spring 作为 DI 容器,您可以连接 fooImpl

@Inject
protected Foo fooImpl;

您的测试需要使用 @RunWith(SpringJUnit4ClassRunner.class) 进行注释,并且由接口(interface)提供者使用其实现配置 Spring。

如果没有 DI 容器,您可以只创建一个包含所有测试的抽象测试类和一个提供实现对象的抽象方法。

protected abstract Foo createFoo();

由实现提供者对测试进行子类化并实现抽象方法。

class FooImplTest extends FooTestSuper {

@Override
protected Foo createFoo() {
    return new FooImpl();
}

如果您有多个测试,请考虑 JUnit 的 @Suite 注释。它与 Spring 测试运行器兼容。

关于java - 最佳实践 : Testing Interface Contract Compliance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14211009/

相关文章:

perl - 使用 Test::Mojo 测试 URL 生成

java - 如何多次实现相同的接口(interface),但使用不同的泛型?

java - 为什么此 PrettyTime 自定义标记会在 HTML 输出中的 "pretty"日期之前生成 11 行空白文本?

java - 如何在Struts 2上应用Spring Security

java - 我正在尝试将拦截器与mvc注释驱动一起添加到spring中,以下应该可以工作,但是不行?

c# - 记录接口(interface)抛出的异常是好的做法吗?

java - 为什么我们应该将接口(interface)方法声明为公共(public)的?

java - HTML 页面比较 - 编辑距离

reactjs - 运行 Jest 时,Babel 不会编译 .test.js 文件

testing - 运行 diskspd 时出错