如何模拟将返回非空值的多个对象

时间:2018-09-24 00:04:28

标签: java mocking easymock

在同时模拟两个对象时,我需要帮助。 如果我将第一个模拟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()。但这没什么区别。

2 个答案:

答案 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))。

Ref: TutorialsPoint.com

答案 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();

请注意,我正在使用静态导入。它使代码更易于接受。