使用easymock收到错误

时间:2012-08-30 20:57:45

标签: java junit4 easymock

我正在开发一个新项目,他们一直在使用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)

3 个答案:

答案 0 :(得分:1)

您正在定义replay(...)两次,因此只会计算第一个reset(...)。在您致电EasyMock.expecting(baseDao.findByNamedQuery("def.query"), EasyMock.anyLong) .andReturn(...); EasyMock.replay(baseDao); 之前,它就是这样定义的。

要解决此问题,您可以:

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

EasyMock.expecting(baseDao.findByNamedQuery((String)EasyMock.anyObject()), 
   EasyMock.anyLong).andReturn(...);

2)您可以期待任何字符串,而不是根据您的期望定义固定字符串:

{{1}}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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);