使用EasyMock测试参数值

时间:2010-05-06 17:04:59

标签: java unit-testing easymock

我正在尝试使用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的文档很好。

4 个答案:

答案 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