Java Scala/Mockito:如何模拟在另一个方法中调用的方法的结果?
我正在尝试使用Mockito为以下类中的doSomeBusinessLogic方法编写Scala单元测试:Java Scala/Mockito:如何模拟在另一个方法中调用的方法的结果?,java,spring,scala,mockito,Java,Spring,Scala,Mockito,我正在尝试使用Mockito为以下类中的doSomeBusinessLogic方法编写Scala单元测试: @Service public class HotelsService { private final HotelsServiceInt hotelsServiceInt; public HotelsService(HotelsServiceInt hotelsServiceInt) { this.hotelsServiceInt = hotelsServiceInt; } pu
@Service
public class HotelsService {
private final HotelsServiceInt hotelsServiceInt;
public HotelsService(HotelsServiceInt hotelsServiceInt) {
this.hotelsServiceInt = hotelsServiceInt;
}
public List<String> getHotels(long val1, long val2) {
return hotelsServiceInt.getHotels(val1, val2)
}
public boolean doSomeBusinessLogic(long val1, long val2) {
List<String> hotels = getHotels(val1, val2);
// Do some logic and return true or false
}
但是,调试上述测试时,显示List hotels=getHotelsval1,val2;实际上是接到了电话
是否有一种方法可以执行doSomeBusinessLogic代码,同时模拟getHotels方法的结果?是的,这是可以实现的,因为您有一个字段:
private final HotelsServiceInt hotelsServiceInt;
您可以在测试类中模拟hotelsServiceInt并返回模拟结果。在调用doSomeBusinessLogic之前,只需返回一个模拟列表即可。
您还需要更改@Mock和@InjectMock的变量类型,如下所示:
@Mock
var hotelsServiceInitMock: HotelsServiceInt = _
@InjectMocks
var hotelsService: HotelsService = _
//then do this:
doReturn(list).when(hotelsServiceInitMock).getHotels(
Matchers.any(), Matchers.any())
现在,您应该能够获得所需的结果 不行!hotelsServiceInt.getHotels不存在。如果我这样做,编译器将无法解析引用,并给出一个错误。您正在测试类中执行hotelsServiceInt.getHotels?不,我没有这样做。我只是说,如果我这样做,它将不起作用。看看这个:请查看更新的答案,我观察到您没有模拟HotelsServiceInt对象,它需要被模拟,@InjectionMock然后将这个模拟对象与测试类链接。我希望这能解决您的问题。如果您可以在代码中包含导入,那么这会有所帮助,因为多个框架使用相同的名称。具体来说,MockFactory来自哪个库,是ScalaMock吗?看起来你混合了几个模拟框架在这里添加了导入到testOk,首先,你没有包括所有的导入MockitoAnnotations@注射模拟@嘲弄如果你想让别人帮助你,最好不要指望他们了解你的想法。其次,您似乎在这里使用了几个模拟框架。当从另一个框架调用时,用一个模拟框架初始化的模拟将无法工作
private final HotelsServiceInt hotelsServiceInt;
@Mock
var hotelsServiceInitMock: HotelsServiceInt = _
@InjectMocks
var hotelsService: HotelsService = _
//then do this:
doReturn(list).when(hotelsServiceInitMock).getHotels(
Matchers.any(), Matchers.any())