Java 如何使用Junit测试工具测试void方法?

Java 如何使用Junit测试工具测试void方法?,java,unit-testing,junit,void,Java,Unit Testing,Junit,Void,我碰巧实现了一个方法void followlink(obj-page,obj-link),它只是将页面和链接添加到队列中。我尝试过测试这种方法,但没有成功 我只想测试队列中是否包含从followlink方法接收的页面和链接。我的测试类已经扩展了TestCase。那么,测试这种方法的最佳方法是什么 您可以在调用方法前后测试队列的大小,例如: int size = queue.length(); followLink(page, link); assertEquals(size+1, queue.l

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


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

您可以在调用方法前后测试队列的大小,例如:

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

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

因此-如果传递给方法的值被添加到队列中,请在方法调用后检查队列。为此,您需要访问队列(如getQueue()。

中有一节介绍返回
void
的测试方法。在您的例子中,您希望测试一个调用的方法

常见问题解答中给出的示例测试添加项目后,
集合的大小会发生变化

@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());
}

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

最有可能的情况是,您的队列是私有的,因此无法检查大小。我看到的“测试设计”解决方案是使用包私有方法和成员。因为您的junit测试可能在同一个包中,所以它们可以访问

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

<>但是我会更进一步:真的,你应该考虑检查你的方法是否已经插入了<强>正确的< /强>页面和链接到你的队列。这方面的细节需要更多关于如何表示(和组合)页面和链接的知识


jMock解决方案也很好,尽管事实上我更熟悉编写自己的测试工具。

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

  • 使用以下程序中的队列/集合大小进行验证: (正如帕特里克指出的那样)

  • 利用模拟对象。像Mockito这样的框架在这里很有用

  • 什么是被测试的类?是否不可能重构该方法以返回除void之外的其他内容?这不像任何现有的代码会被打扰,因为没有对该方法的调用会查看结果。;)如果您出于测试目的需要这样的东西,它会提示您,您可能也需要在生产性使用中使用它。这种方法有副作用,这些作用在某种程度上是可以实现的。但getQueue()就是一个例子。与其他答案一样,获取队列的大小/长度也是对队列的某种访问,但不是直接访问器。那也可以。让测试用例(基于需求)驱动您的设计,这就是为什么它被称为测试驱动设计的原因。:-)
    @Test
    public void testfollowlinkAdd() {
      int size = queue.length();
      queue.add(pageLink);   //Considering an Object of PageLink
      Assert.assertTrue(size+1, queue.length());
    }