我们可以使用 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
...)
我有一个名为 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
...)