【问题标题】:Mockito when/then not workingMockito 何时/然后不工作
【发布时间】:2016-06-22 16:03:21
【问题描述】:

我正在尝试在 SubscriptionInterceptor 的单元测试中模拟 ValidatorService

validator = Mockito.mock(ValidatorService.class);
Mockito.when(validator.validateSubscription(any(), any(), any())).thenReturn("");
interceptor = new SubscriptionInterceptor(validator);

稍后,当拦截器调用模拟验证器的validateSubscription 方法时,会调用实际类的实例,而不是模拟。为什么?如何让方法调用返回一个空字符串?

【问题讨论】:

  • 您不需要为要返回的空字符串执行任何特殊操作;只要 Mockito 可以存根该方法,它就是默认返回值,这在这里似乎无法做到。您能否确认 ValidatorService 和 validateSubscription 都是公开的且非final
  • 方法被宣布为最终方法。现在可以了,谢谢!

标签: spring unit-testing testing junit mockito


【解决方案1】:

在 cmets 中解决:

方法被声明为最终方法。

Mockito 通过提供相关类的代理(子类)来工作,其中每个方法都被覆盖。但是,对于final 类和方法,Java 假定它可以检测到它需要调用哪个实现,并跳过动态方法查找。因此,Mockito 无法覆盖 final 方法、static 方法或 final 类上的方法的行为,并且因为您没有与模拟 Mockito 交互,因此甚至无法警告您。

这是一个很常见的问题;如果 Mockito 不能用于存根/验证您的方法,请务必检查 final 字段。

【讨论】:

    猜你喜欢
    • 2015-10-03
    • 2015-10-02
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多