Iterable

时间:2016-10-14 19:01:26

标签: java unit-testing junit

我正在为以下方法开发一个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();

2 个答案:

答案 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(),这样更容易阅读。