【问题标题】:getting InvalidUseOfMatchersException in a proper use of matchers在正确使用匹配器时获取 InvalidUseOfMatchersException
【发布时间】:2017-07-31 06:53:19
【问题描述】:

一切听起来都是正确的,但是当我尝试模拟受保护的方法时,我得到了 org.mockito.exceptions.misusing.InvalidUseOfMatchersException。我该如何解决它?

private Service service;
private System system;

@BeforeMethod
  public void setupMocks() throws Exception {
     service = powerMock.mock(Service.class);
     system = powerMock.mock(System.class);

}

public void sample_Test() {
     PowerMockito.doReturn(system).when(service, "getValidatedDto",  
     Matchers.any(Long.class), Matchers.any(Date.class));
    // some code
}

【问题讨论】:

  • 你的测试看起来很失败;通常是与您发布的测试不同的测试,because Matchers use global state。请发布您的异常消息的文本,以及使用匹配器的其他测试。您还可以考虑添加一个调用Mockito.validateMockitoUsage()@AfterMethod,如果它滥用Mockito,这将导致测试显式失败。

标签: unit-testing mockito matcher powermockito


【解决方案1】:

我怀疑你看到了这个异常:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 参数匹配器的使用无效! 预计 4 个匹配器,2 个记录:

有了这个额外的上下文:

如果匹配器与原始值组合,则可能会发生此异常: //不正确: someMethod(anyObject(), "原始字符串");

如果是这样,那么这是因为您将匹配器形式的参数(Matchers.any(Long.class)Matchers.any(Date.class))与原始值形式的参数(service"getValidatedDto")混合在一起。

我不清楚被测方法的签名,但我认为它可能类似于

System getValidatedDto(Long aLong, Date aDate);

如果是这样,那么正确的调用应该是:

PowerMockito.doReturn(system).when(service).getValidatedDto(  
    Matchers.any(Long.class), Matchers.any(Date.class));

【讨论】:

  • 是的。我得到了那个例外,但你的解决方案不起作用。如果我们将参数之一用于匹配器,则只有所有参数必须采用匹配器形式。为什么要使用 Matchers 作为方法名和模拟对象?
  • 您能否通过发布更新的测试方法和异常消息来澄清您的最后评论。
  • 我已经更新了答案。如果您再次发布,您能否向我展示(a)您尝试测试的方法的签名,(b)您更新的测试方法和(c)异常消息。
  • 虽然这是一个开始寻找的好地方,PowerMockito explicitly has a when call that takes an Object and a String,以及可能是匹配器的参数。虽然它可能会失败,因为 when 是为 private 方法设计的,或者如果 Java 选择了错误的重载,我不相信你在这里的推论是准确的:Matchers 的使用可以很好没事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多