2009-08-07 88 views
26

我只是碰巧实现了一个方法void followlink(obj page,obj link),它只是将页面和链接添加到队列中。我没有试图测试这种方法。如何使用Junit测试工具测试void方法?

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

+0

什么是被测试的类? – 2009-08-07 12:53:16

+0

是否可以重构该方法以返回除void之外的其他内容?这不像任何现有的代码会被打扰,因为没有调用该方法的结果。 ;) – 2009-08-07 13:02:50

回答

15

您可以测试规模,如果前面召唤你的方法后的队列,像:

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

你可能会做的另一件事是空队列开始,打电话followLink,然后出队的第一项并测试其值。

0

所以 - 如果传递给方法的值被添加到队列中,则在方法调用队列后检查。您需要访问队列(类似于getQueue())。

+4

仅用于测试目的添加访问器是一件好事? – dfa 2009-08-07 13:10:04

+0

如果你需要这样的东西用于测试目的,它暗示,你也可能需要它在生产使用。该方法有一个副作用,这些效果可以通过某种方式访问​​。但getQueue()就是一个例子。像其他答案一样获取队列的大小/长度也是对队列的某种访问,但不是直接访问者。这也是可以的。让测试案例(基于需求)驱动您的设计,这就是为什么它被称为测试驱动设计。 :-) – Mnementh 2009-08-07 14:59:35

37

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

使用jMock库和嘲笑一个存储保存您的队列,JMock的允许断言模拟的方法是否被调用,并用什么参数。

2

最有可能的是,你的队列是私人,所以检查大小是行不通的。我所看到的“用于测试的设计”解决方案是利用包私有方法和成员。由于你的junit测试可能在同一个软件包中,他们将有权访问。

那自己让“queue.length()”副作用测试工作。

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

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

0

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

  1. 验证使用的队列/集合的大小如下面的程序: (正如帕特里克指出)

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

OR

  • 。利用MockObjects的。像Mockito这样的框架在这​​里可以有所帮助。