【发布时间】:2016-01-16 01:12:57
【问题描述】:
假设一个接口像:
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,...)?
【问题讨论】:
-
我不知道是否有标准方法,但是首先,我将创建一个具有单个抽象方法 createFoo() 的抽象类,然后是具体的测试方法,而不是静态方法。或者某种 DI —— DI 框架和测试框架之间可能存在集成。
-
我认为没有标准的方法可以做到这一点,但恕我直言,静态方法是一种很好的方法。您不应该在您的库中使用任何 JUnit 代码并通过简单地抛出 AssertionsError 来进行断言。这使您的测试可以与 TestNG 和 JUnit 一起使用。
-
这些测试是集成测试:它们测试关于其他组件的假设是否成立。相反,在单元测试中,当您创建双精度对象(模拟、存根)时,您会根据您对其他组件的假设来实现它们。也就是说,单元测试不适合识别对其他组件的误解。
标签: java unit-testing testing junit