【问题标题】:Test param value using EasyMock使用 EasyMock 测试参数值
【发布时间】:2010-05-06 17:04:58
【问题描述】:

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

【问题讨论】:

  • 我相信如果您创建相同的栏,它会起作用。你为什么不试试呢?
  • 我的理解是,这种方法更多地依赖于 Bar.equals() 的实现,而不是我的 execute() 方法的实现。虽然我认为这可行,但似乎有更好的方法。
  • 是的,您会断言传递给模拟的 bar 实例与您期望的相同。如果您的 Bar 的 equals() 方法不足以满足您想要测试的内容,或者测试的字段比您在测试中关心的更多,那么捕获是一个更好的选择(尽管它提出了什么 Bar.equals( ) 是不够的)。
  • 同意,但测试 Bar.equals() 不是我目前正在进行的测试的工作;-)

标签: java unit-testing easymock


【解决方案1】:

啊哈!捕获是关键。

@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(), ???);
}

【讨论】:

【解决方案2】:

你试过了吗?`

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

我不确定我脑海中的语法,但这应该可以。

【讨论】:

    【解决方案3】:
    f.setBar(EasyMock.isA(Bar.class))
    

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

    【讨论】:

      【解决方案4】:

      我将构造一个对象,它是 equal 到我希望返回的对象。在这种情况下,我将创建一个 new Bar 并将其 ID 设置为 123,这依赖于 Barequals()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 实现的测试,而不是您打算测试的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多