【问题标题】:How to test void method with Junit testing tools?如何使用 Junit 测试工具测试 void 方法?
【发布时间】:2009-08-07 12:50:52
【问题描述】:

我只是碰巧实现了一个方法void followlink(obj page,obj link),它只是将页面和链接添加到队列中。我没有成功尝试测试这种方法。

我只想测试队列中是否包含从 followlink 方法接收的页面和链接。我的测试类已经扩展了 TestCase。那么测试这种方法的最佳方法是什么?

【问题讨论】:

  • 被测类是什么?
  • 难道不能重构方法以返回 void 以外的东西吗?不会打扰任何现有代码,因为没有对该方法的调用正在查看结果。 ;)

标签: java unit-testing junit void


【解决方案1】:

JUnit FAQ 有一节介绍返回 void 的测试方法。在您的情况下,您想测试被调用方法的side effect

FAQ 中给出的示例测试Collection 的大小在添加项目后会发生变化。

@Test
public void testCollectionAdd() {
    Collection collection = new ArrayList();
    assertEquals(0, collection.size());
    collection.add("itemA");
    assertEquals(1, collection.size());
    collection.add("itemB");
    assertEquals(2, collection.size());
}

【讨论】:

    【解决方案2】:

    如果队列在调用你的方法之前和之后,你可以测试它的大小,比如:

    int size = queue.length();
    followLink(page, link);
    assertEquals(size+1, queue.length()); // or maybe size+2?
    

    您可能会做的另一件事是从一个空队列开始,调用 followLink,然后将第一个项目出列并测试其值。

    【讨论】:

      【解决方案3】:

      很可能,您的队列是私有,因此检查大小不起作用。我见过的“测试设计”解决方案是使用 package private 方法和成员。由于您的 junit 测试可能在同一个包中,因此它们可以访问。

      这本身就可以让“queue.length()”副作用测试工作。

      但我会更进一步:真的,您应该考虑检查您的方法是否插入了正确页面并链接到您的队列。详细信息需要更多关于如何表示(和组合)页面和链接的知识。

      jMock 解决方案也非常好,但实际上我更熟悉编写自己的测试工具。

      【讨论】:

        【解决方案4】:

        所以 - 在方法调用后检查队列,是否将传递给方法的值添加到队列中。为此,您需要访问队列(类似于 getQueue())。

        【讨论】:

        • 如果您出于测试目的需要这样的东西,它暗示,您可能也需要在生产中使用它。该方法有副作用,这些效果将以某种方式获得。但 getQueue() 就是一个例子。在其他答案中获取队列的大小/长度也是对队列的某种访问,但不是直接访问器。那也没关系。让测试用例(基于需求)驱动你的设计,这就是它被称为测试驱动设计的原因。 :-)
        【解决方案5】:

        使用 jMock 库并模拟一个保存队列的存储,jMock 允许断言是否调用了模拟方法以及使用什么参数。

        【讨论】:

          【解决方案6】:

          我们有两种方法可以检查以下内容:

          1. 使用 Queue/Collection 的大小进行验证,如下面的程序所示: (正如帕特里克所指出的)

            @Test
            public void testfollowlinkAdd() {
              int size = queue.length();
              queue.add(pageLink);   //Considering an Object of PageLink
              Assert.assertTrue(size+1, queue.length());
            }
            

          1. 利用 MockObjects。像 Mockito 这样的框架可以在这里提供帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-23
            • 2021-08-27
            • 2023-02-17
            相关资源
            最近更新 更多