Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala/Mockito:如何模拟在另一个方法中调用的方法的结果?_Java_Spring_Scala_Mockito - Fatal编程技术网

Java Scala/Mockito:如何模拟在另一个方法中调用的方法的结果?

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

我正在尝试使用Mockito为以下类中的doSomeBusinessLogic方法编写Scala单元测试:

@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())