2010-05-06 19 views
2

我试图用EasyMock和TestNG编写一些单元测试,并且遇到了问题。鉴于以下几点:使用EasyMock测试参数值

void execute(Foo f) { 
    Bar b = new Bar() 
    b.setId(123); 
    f.setBar(b); 
} 

我试图测试该栏的ID获取以下列方式进行相应的设置:

@Test 
void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 

    execute(f); 

    Bar b = ?; // not sure what to do here 
    f.setBar(b); 
    f.expectLastCall(); 
} 

在我的测试,我不能就这么叫f.getBar()和检查它是否是因为f是模拟对象。有什么想法吗?这是我想看看EasyMock v2.5增加andDelegateTo()andStubDelegateTo()

哦,只是为了记录... EasyMock的文档打击。

+0

我相信如果你创建的是同样的酒吧,它会工作。你为什么不尝试? – 2010-05-06 17:08:09

+0

我的理解是,这种方法更依赖Bar.equals()的实现,而不是执行我的execute()方法。虽然我认为这会奏效,但似乎还有更好的办法。 – fmpdmb 2010-05-06 17:17:48

+1

是的,你会断言传递给模拟的酒吧实例等于你所期望的。如果你的Bar的'equals()'方法不足以满足你想要测试的内容,或者在你的测试中测试比你关心的更多的字段,那么捕获是一个更好的选择(尽管它提出了什么Bar的问题。等于()是不够的)。 – 2010-05-06 17:39:35

回答

8

啊哈!捕获是关键。

@Test 
void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 

    Capture<Bar> capture = new Capture<Bar>(); 
    f.setBar(EasyMock.and(EasyMock.isA(Bar.class), EasyMock.capture(capture))); 
    execute(f); 

    Bar b = capture.getValue(); // same instance as that set inside execute() 
    Assert.assertEquals(b.getId(), ???); 
} 
+0

有关更详细的解释,请查看我的EasyMock教程(特别是第3部分):https:// turnlevel。 com/2013/05/28/easymock-fundamentals-3/ – fmpdmb 2014-03-04 20:22:25

0
f.setBar(EasyMock.isA(Bar.class)) 

这将确保setBar被调用时使用Bar类作为参数。

0

我会构造一个对象,它是equal到我期望找回的那个。在这种情况下,我会创建一个new Bar并将它的ID设置为123,依靠equals()hashCode()Bar的正确实现以及EasyMocks参数匹配器的默认行为(对参数进行等同比较)。

@Test 
public void test_execute() { 
    Foo f = EasyMock.createMock(Foo.class); 
    Bar expected = new Bar(); 
    expected.setId(123); 
    f.setBar(expected); 
    EasyMock.expectLastCall(); 
    EasyMock.replay(f); 

    execute(f); 

    EasyMock.verify(f); 
} 
+0

我认为这更多的是对Bar的实现的测试,而不是你打算测试的方法。 – fmpdmb 2010-05-06 18:57:45

1

你试过吗?`

final Bar bar = new Bar(); 
bar.setId(123); 
EasyMock.expect(f.getBar()).andAnswer(new IAnswer<Bar>() { 
    public Bar answer() {    
     return bar; 
    } 
}); 

我不知道在我的头顶语法,但是这应该工作。