我正在尝试在SubscriptionInterceptor
的单元测试中模拟ValidatorService
。
validator = Mockito.mock(ValidatorService.class);
Mockito.when(validator.validateSubscription(any(), any(), any())).thenReturn("");
interceptor = new SubscriptionInterceptor(validator);
后来,当拦截器调用模拟验证器的validateSubscription
方法时,调用了实际类的实例,而不是模拟。为什么?如何获得方法调用以返回空字符串?
在注释中解决:
方法被声明最终。
Mockito通过提供所讨论的类的代理(子类)来起作用,每种方法都被覆盖。但是,对于final
类和方法,Java假定它可以检测到需要调用的实现,并跳过动态方法查找。因此,Mockito无法覆盖final
方法,static
方法或final
类中的方法,并且因为您没有与Mock Mockito进行交互,甚至无法警告您。
这是一个非常普遍的问题;如果Mockito不起作用/验证您的方法,请务必检查final
字段。
,为了不删除 final
, static
fields/classs/class/class/methods在主java源中,您可以在operto的"何时/then"之后放置模拟初始化。存根。在所有存根初始化之后,它将调用带有final
S的模拟对象的构造函数。
尝试:
Mockito.when(validator.validateSubscription(any(), any(), any())).thenReturn("");
validator = Mockito.mock(ValidatorService.class);
interceptor = new SubscriptionInterceptor(validator);