我正在为以下方法开发一个Junit 4测试用例(黑盒子):
/**
* Returns all points in the symbol table.
*/
public Iterable<Point2D> points();
该方法应该返回KdTree符号表中的所有点。我不对从方法返回的Iterable的特定实现做出任何假设,因此我开发了以下单元测试:
@Test
public void emptySTPointsTest() {
KdTreeST<Integer> kd = new KdTreeST<>(); // initializing empty ST
Iterable<Point2D> pts = kd.points(); // arbitrary decision
assertFalse(pts.iterator().hasNext()); // ?!
}
还有其他方法可以检查Iterable的实例是否为空(?)什么是实现这些单元测试的“正确”(或最常见)方式,当你无法明确检查元素数量而你不知道它们进入哪个顺序时(不是只是空的情况,但总的来说)?
P.S我曾尝试使用Hamcrest的Matchers,但是Iterable接口没有指定size()
方法,所以我想在这种情况下它不会那么有用。
修改:而不是
Iterable<Point2D> pts = new HashSet<>();
我应该写Iterable<Point2D> pts = kd.points();
答案 0 :(得分:0)
你的方法很好;它没有任何问题。正如另一个答案所指出的,你正在测试你从HashSet而不是KdTreeST
获得的迭代器。
此外,还有一个Hamcrest匹配器适合您的情况。
assertThat(pts.iterator(), is(emptyIterable()));
(假设您从org.hamcrest.Matchers
静态导入)
答案 1 :(得分:0)
您编写的单元测试是对HashSet类进行单元测试(特别是当集合为空时HashSet#iterator()
的行为)。它没有测试您的points
方法。
要回答关于空Iterables的问题,但是......看起来这肯定是测试空Iterable的一种方法。 Iterable界面只有一种方法:iterator
。
或许声明points
返回Iterable
对于您的需求来说有点过于抽象。为什么不把它提升到Collection<Point2D>
?这样,您就可以使用Collection#isEmpty(),这样更容易阅读。