【问题标题】:EasyMock - matchers are mixed with raw values?EasyMock - 匹配器与原始值混合?
【发布时间】:2014-03-19 16:56:58
【问题描述】:

我有这个方法签名,我想用 EasyMock 模拟

public BigDecimal getRemainingPremium(BigDecimal baseAmount, Date commencementDate, Date effectiveDate, boolean isComplete)

我的测试代码有

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

但我不断收到此匹配器异常。我已经尝试了原语和“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)

【问题讨论】:

  • 我会添加你的整个测试。通常当你得到foo(5, eq(6)); // wrong 错误时,是因为你没有使用足够的匹配器,但是这里使用的匹配器的数量比预期的要多,所以我怀疑你在调用 replay 后使用了匹配器。跨度>
  • @DanTemple 抱歉 - 我用额外的行更新了测试代码(我认为它不会影响测试)。这解释了第 5 个匹配器的出现位置,但我不确定调用 replay() 将如何影响这一点?

标签: java easymock


【解决方案1】:

您在应该使用实际对象的地方使用匹配器。

EasyMock.expect(premium.getCommencementDate()).andReturn(EasyMock.anyObject(Date.class)).anyTimes();

在上面的行中,您使用了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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多