我正在尝试使用EasyMock和TestNG编写一些单元测试,并遇到了一个问题。鉴于以下内容:
void execute(Foo f) {
Bar b = new Bar()
b.setId(123);
f.setBar(b);
}
我正在尝试以下列方式测试Bar的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()
并检查它的Id,因为f
是一个模拟对象。有什么想法吗?这是我想要查看EasyMock v2.5添加andDelegateTo()
和andStubDelegateTo()
吗?
哦,只是为了记录... EasyMock的文档很好。
答案 0 :(得分:9)
@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(), ???);
}
答案 1 :(得分:1)
你试过这个吗?`
final Bar bar = new Bar();
bar.setId(123);
EasyMock.expect(f.getBar()).andAnswer(new IAnswer<Bar>() {
public Bar answer() {
return bar;
}
});
我不确定我的头脑上的语法,但这应该有效。
答案 2 :(得分:0)
f.setBar(EasyMock.isA(Bar.class))
这将确保使用Bar类作为参数调用setBar。
答案 3 :(得分:0)
我构建了一个对象equal
到我希望得到的对象。在这种情况下,我创建一个new Bar
并将其ID设置为123,依赖于equals()
的{{1}}和hashCode()
的正确实现以及EasyMocks的默认行为参数匹配器(使用参数的相等比较)。
Bar