在同时模拟两个对象时,我需要帮助。
如果我将第一个模拟obj的返回值(即,mockClassA)设置为null
,则可以正常工作。我正在使用EasyMock的注释@Mock
,@TestSubject
。而且,如果我没有将第一个模拟期望的返回值设置为null
,则会看到以下错误。
java.lang.IllegalStateException: last method called on mock is not a void method
这是代码,我正在尝试:
EasyMock.expect(mockClassA.getValfromDB()).andReturn(ValA);
EasyMock.replay();
EasyMock.expect(mockoClassB.makeRestCall(EasyMock.anyString())).times(2).andReturn(httpResponse);
EasyMock.replay();
如果EasyMock不支持在单个方法中模拟多个对象,则可以使用Mockito,PowerMockito和EasyMockSupport。也请随时从这些库中建议我一些东西。
PS:我已经尝试使用EasyMockSupport中的replayall()
。但这没什么区别。
答案 0 :(得分:0)
我能够调试我的代码,发现我以错误的方式浪费了时间。
更改线路
EasyMock.expect(mockClassB.makeRestCall(EasyMock.anyString())).times(2).andReturn(httpResponse);
EasyMock.replay();
到
EasyMock.expect(mockClassB.makeRestCall(EasyMock.anyString())).andReturn(httpResponse);
EasyMock.expectLastCall().times(2);
EasyMock.replay();
已经解决了我的问题(观察expectLastCall.times(2)
)。
答案 1 :(得分:0)
必须将模拟传递给replay()
方法。因此,您的原始代码或答案都有效。但是,确实times()
必须在andReturn()
之后。
所以正确的代码应该是
expect(mockClassA.getValfromDB()).andReturn(ValA);
expect(mockClassB.makeRestCall(anyString())).andReturn(httpResponse).times(2);
replay(mockClassA, mockClassB);
或与此EasyMockSupport
:
expect(mockClassA.getValfromDB()).andReturn(ValA);
expect(mockClassB.makeRestCall(anyString())).andReturn(httpResponse).times(2);
replayAll();
请注意,我正在使用静态导入。它使代码更易于接受。