假设一个界面如:
public interface Fooer {
void foo();
boolean isFooed();
}
这是我正在编写的Java库的一部分。该库的用户应该实现此接口并将对象传递到我的库中。
我想为用户提供一种方法来测试他们的实现来保存不变量我的库代码假设。
按照上面的例子:
Fooer f = getUsersFooer();
f.foo();
// f.isFooed() MUST return true now
是否有可能,如果可行,甚至可以接受提供此类测试作为图书馆的一部分?
(我不知道这些是否会被视为单元测试或集成测试......他们使用getter方法或非常原始的非变异方法测试单个方法所做的修改)
当然,我可以编写像
这样的课程public class TestFooer {
public static boolean test(Fooer f) {
// ...
}
}
但是有一种“标准方式”,使用通常的测试框架(JUnit,...)?
答案 0 :(得分:0)
这是用于检查某些规范实现的合规性的常用模式。这称为 TCK,Technology Compatibility Kit。我没有看过很多 TCK 的代码,但我看到他们经常使用 TestNG。
最近在 JUnit 5.8.0-M1 中添加了一个功能,它允许定义也可用于此目的的测试套件。
您的 TCK 对您的 API 和 org.junit.jupiter:junit-jupiter
(至少 5.8.0-M1
)加上 org.junit.platform:junit-platform-suite
(至少 1.8.0-M1
)。测试不在 src/test/java
中,而是在 src/main/java
中。然后您将套件类添加到您的 TCK 中,例如:
package org.example;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;
@Suite
@SelectPackages("org.example")
public abstract class TestCompatibilityKitSuite {}
请注意,这个类不必是抽象的,我只是认为它使预期用途更加清晰。
然后该实现依赖于 api
和 test
依赖于 tck
。要运行测试,请添加如下类:
package test;
import org.example.TestCompatibilityKitSuite;
class TckTest extends TestCompatibilityKitSuite {}
TCK 必须加载实现。这样做的一个好方法是使用 java.util.ServiceLoader
。有关完整示例,请查看 here。