使用Mockito Spy监视类方法时存根方法未调用问题排查
问题原因及解决办法
核心问题
你测试代码里创建的spyGetOptionBidPrice和源代码里通过new GetOptionBidPrice(...)生成的实例完全是两个独立对象,给spy设置的存根返回值根本不会作用到源代码实际使用的那个实例上,自然会拿到真实类的默认值0。
解决步骤
要让存根生效,必须让源代码使用你创建的spy实例,而不是自己new新对象,常见实现方式有两种:
依赖注入替换实例
如果GetOptionBidPrice是通过构造器注入、Setter注入等方式传入到使用它的类中,测试时直接把你创建的spy注入进去即可:// 假设使用该类的业务类为OptionService OptionService optionService = new OptionService(spyGetOptionBidPrice); // 调用optionService的业务方法,此时会使用你配置好的spy实例用PowerMock拦截new对象操作(无法修改源代码依赖方式时)
要是源代码里硬编码了new GetOptionBidPrice(...),没法通过注入替换,就用PowerMock拦截new操作,让它返回你的spy实例:// 先配置好spy的存根 GetOptionBidPrice spyGetOptionBidPrice = spy(new GetOptionBidPrice(...)); doReturn(100.0).when(spyGetOptionBidPrice).getBidPrice(); // 拦截new操作,返回已配置的spy whenNew(GetOptionBidPrice.class).withAnyArguments().thenReturn(spyGetOptionBidPrice);
额外提醒
- Spy的常规用法是包装已有实例,即
spy(new GetOptionBidPrice(...)),直接spy类(spy(GetOptionBidPrice.class))会创建空代理实例,容易引发异常或不符合预期的行为。 - 日常开发尽量避免硬编码new对象,采用依赖注入模式,能大幅降低测试难度。
内容的提问来源于stack exchange,提问作者Kannan J
相关产品推荐
相关产品推荐

