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