使用EasyMock测试参数值

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的文档很烂。


我相信如果你创建完全一样的栏,它会起作用。为什么不试试呢? - Samuel Carrijo
我理解这种方法更依赖于Bar.equals()的实现,而不是我的execute()方法的实现。虽然我认为这样做可以工作,但似乎有更好的方法。 - fmpdmb
1
是的,您将断言传递给模拟对象的 Bar 实例与您期望的实例相等。如果您要测试的内容不仅仅是 Bar 的 equals() 方法所能满足的,或者测试了您在测试中不关心的更多字段,则捕获是更好的选择(尽管这会引出一个问题:为什么 Bar.equals() 不足够)。 - matt b
同意,但测试Bar.equals()不是我目前正在工作的测试的任务;-) - fmpdmb
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(), ???);
}

更详细的解释,请查看我的EasyMock教程(特别是第三部分):https://turnlevel.com/2013/05/28/easymock-fundamentals-3/ - fmpdmb

1

你试过这个吗?

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

我不确定我能否立刻想起语法,但这应该可以工作。


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

这将确保 setBar 方法被调用时传入了一个 Bar 类作为参数。


0
我会构建一个对象,它与我期望得到的对象相等。在这种情况下,我会创建一个新的Bar并将其ID设置为123,依赖于Bar的equals()和hashCode()的正确实现以及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);
}

我认为这更多是对 Bar 实现的测试,而不是您打算测试的方法。 - fmpdmb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接