3

我正在尝试使用 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

4 回答 4

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(), ???);
}
于 2010-05-06T17:37:31.753 回答
1

你试过这个吗?

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

我不确定我头顶上的语法,但这应该可以。

于 2010-05-07T07:27:21.783 回答
0
f.setBar(EasyMock.isA(Bar.class))

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

于 2010-05-06T17:07:16.170 回答
0

我会构造一个对象,它是equal我希望返回的对象。在这种情况下,我将创建一个new Bar并将其 ID 设置为 123,这依赖于和的正确实现以及equals()EasyMocks参数匹配器的默认行为(对参数使用相等比较)。hashCode()Bar

@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);
}
于 2010-05-06T17:56:50.547 回答