5

我正在做一个新项目,他们一直在使用我不太熟悉的 EasyMock (v2.4)。我需要能够做到以下几点,但没有人有答案。当前框架使用BaseDao.class我想根据以下示例模拟的一个,但我收到一个错误。我正在寻找一些方向。

BaseDao baseDao = EasyMock.mock(BaseDao.class);

EasyMock.expect(baseDao.findByNamedQuery("abc.query"), EasyMock.anyLong()).andReturn(...);
EasyMock.replay(baseDao);

EasyMock.expect(baseDao.findByNamedQuery("def.query"), EasyMock.anyLong).andReturn(..);
EasyMock.replay(baseDao);

我得到的错误如下......

java.lang.AssertionError: 
  Unexpected method call findByNamedQuery("def.query"):
    findByNamedQuery("abc.query", 1): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:32)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:61)
at $Proxy5.findByNamedQuery(Unknown Source)
4

3 回答 3

1

您定义了replay(...)两次,因此只有第一个会计算在内。它是这样定义的,直到您调用reset(...).

要解决此问题,您可以:

1)删除导致测试失败的调用:

EasyMock.expecting(baseDao.findByNamedQuery("def.query"), EasyMock.anyLong)
   .andReturn(...);
EasyMock.replay(baseDao);

2)您可以期望任何字符串,而不是在您的期望中定义一个固定的字符串:

EasyMock.expecting(baseDao.findByNamedQuery((String)EasyMock.anyObject()), 
   EasyMock.anyLong).andReturn(...);
于 2012-08-30T21:46:42.557 回答
0

看起来测试期望使用参数“abc.query”进行方法调用,但该方法是使用“def.query”调用的。

逐步调试测试应该有助于发现问题。

于 2012-08-30T21:11:37.330 回答
0

如果您希望 findByNamedQuery 被调用两次,则删除对 replay 方法的第一次调用。只需要一次,毕竟您对测试的期望已经设定。

BaseDao baseDao = EasyMock.mock(BaseDao.class);

EasyMock.expect(baseDao.findByNamedQuery("abc.query"), EasyMock.anyLong()).andReturn(...);
// Remove EasyMock.replay(baseDao);

EasyMock.expect(baseDao.findByNamedQuery("def.query"), EasyMock.anyLong).andReturn(..);
EasyMock.replay(baseDao);
于 2012-08-30T21:56:02.620 回答