gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:14 25 4
gpt4 key购买 nike

假设定义了接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com