我有这个方法签名,我想用EasyMock模拟
public BigDecimal getRemainingPremium(BigDecimal baseAmount, Date commencementDate, Date effectiveDate, boolean isComplete)
Run Code Online (Sandbox Code Playgroud)
我的测试代码有
Premium premium = createMock(Premium.class);
// add this line
EasyMock.expect(premium.getCommencementDate()).andReturn(EasyMock.anyObject(Date.class)).anyTimes();
expect(
premium.getRemainingPremium(
EasyMock.anyObject(BigDecimal.class),
EasyMock.anyObject(Date.class),
EasyMock.anyObject(Date.class),
EasyMock.anyBoolean()
))
.andReturn(BigDecimal.TEN).anyTimes();
Run Code Online (Sandbox Code Playgroud)
但我一直得到这个匹配器的例外.我已经尝试了所有基元组合和'EasyMock.anyObject(Boolean.class)'.有关解决方法的任何建议吗?
java.lang.IllegalStateException: 4 matchers expected, 5 recorded.
This exception usually occurs when matchers are mixed with raw values when recording a method:
foo(5, eq(6)); // wrong
You need to use no matcher at all or a matcher for every single param:
foo(eq(5), eq(6)); // right
foo(5, 6); // also right
at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:48)
at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:41)
at org.easymock.internal.RecordState.invoke(RecordState.java:79)
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:41)
Run Code Online (Sandbox Code Playgroud)
您正在使用匹配器,您应该使用实际对象.
EasyMock.expect(premium.getCommencementDate()).andReturn(EasyMock.anyObject(Date.class)).anyTimes();
Run Code Online (Sandbox Code Playgroud)
在上面的行中,您已经使用了anyObject()匹配器,您真正想要使用Date对象.
我想知道你是否在这种意义上混淆了嘲笑者.anyObject()匹配器是一种确认您使用类型对象调用模拟方法的方法Date.它不会创建可用作Date类实例的日期对象.为此,您需要创建一个模拟实例Date.因此,请记住,匹配器应该用作模拟方法的参数,而不是返回值.
以下期望将解决您的问题:
Date mockDate = EasyMock.createMock(Date.class);
final IPremium premium = EasyMock.createMock(IPremium.class);
EasyMock.expect(premium.getCommencementDate()).andReturn(mockDate).anyTimes();
expect(
premium.getRemainingPremium(
(BigDecimal) EasyMock.anyObject(),
(Date) EasyMock.anyObject(),
(Date) EasyMock.anyObject(),
EasyMock.anyBoolean()
))
.andReturn(BigDecimal.TEN).anyTimes();
replay(premium);
Run Code Online (Sandbox Code Playgroud)