【问题标题】:Can we mock a spy object using mockito?我们可以使用 mockito 模拟一个间谍对象吗?
【发布时间】:2018-01-22 22:49:50
【问题描述】:

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

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

我在另一个名为 StationMonitor 的类中有一个链式方法调用,该类是通过使用 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);

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

【问题讨论】:

  • “它抱怨存根正确”是什么意思?您是否收到某种错误消息?在运行时还是编译时?另外,stationMonitorLoader 是什么?另一个间谍或模拟?

标签: java mockito junit4


【解决方案1】:

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

是的。

这里的问题是:

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

这违反了demeter 法则(又名不要和陌生人说话!)。

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

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2018-07-03
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多