我们可以使用 mockito 模拟间谍对象吗?

Can we mock a spy object using mockito?

我有一个名为 RadiationControl 的 class,我通过以下方式为它创建了一个间谍。

RadiationControl radCtrl = new RadiationControl();
RadiationControl spyRadCtrl = Mockito.spy(radCtrl);

我在另一个名为 StationMonitor 的 class 中有一个链式方法调用,它是通过使用 RadiationControl 对象调用的。当我尝试使用上面创建的间谍并尝试访问具有方法参数的间谍时,它们会不时变化。

StationMonitorObject stationMonitorObject = radCtrl.getStationMonitorLoader().retrieveCVStationMonitorObject(Long.parseLong(syngId), status);

因此,使用上述语法时,当我尝试为该方法调用存根间谍时,它会抱怨无法正确存根。

StationMonitorLoader stationMonitorLoader = StationMonitorLoader.getLoader(domain);
  Mockito.doReturn(stationMonitorLoader).when(spyRadCtrl).getStationMonitorLoader();

  Mockito.doReturn(stationMonitorObject).when(stationMonitorLoader).retrieveCVStationMonitorObject(any(Long.class), null);

有没有更好的方法来处理这种情况?

Is there any better approach to deal such scenario ?

是的。

这里的问题是:

radCtrl.getStationMonitorLoader()
       .retrieveCVStationMonitorObject(Long.parseLong(syngId), status);

这违反了得墨忒耳法则(也就是不要和陌生人说话!)。

方法 retrieveCVStationMonitorObject() 应该在 class RadiationControl 中可用,并将调用委托给 它的 依赖项(看起来像是 StationMonitorLoader...)