繁体   English   中英

Scala / Mockito:如何模拟另一个方法内部调用的方法的结果?

[英]Scala/Mockito: How to mock the result of a method called inside another method?

我正在尝试使用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
}

这是接口:

public interface HotelsServiceInt {

@GET("/{val1}/{val2}")
Observable<List<String>> getHotels(
@Path("val1") long val1,                                                                             
@Path("val2") long val2);
}

这是我为它编写的Scala测试:

import org.mockito._
import org.scalamock.scalatest.MockFactory
import org.scalatest.{BeforeAndAfter, FunSpec}
import org.mockito.Mockito._

 class Spec extends FunSpec with MockFactory with BeforeAndAfter {
   @InjectMocks
   var hotelsServiceInjectedMock: HotelsService = _
   @Mock
   var hotelsService: HotelsService = _

   before{
    hotelsServiceInjectedMock = new HotelsService(hotelsServiceInt)
       MockitoAnnotations.initMocks(this)
   }
   describe("Test") {

   it("Should return false.") {
    val val1 = 1l
    val val2 = 2l
    list = new ArrayList()
    list.add("Hitlon")
    list.add("Sheraton")
    list.add("Rotana")
    doReturn(list).when(hotelsService).getHotels(
                     Matchers.any(), Matchers.any())
    val result = hotelsServiceInjectedMock.doSomeBusinessLogic(val1, val2)
    assert(result == false)
  }}
}

但是,调试上面的测试显示List<String> hotels = getHotels(val1, val2); 正在被实际调用。

有没有一种方法可以执行“ doSomeBusinessLogic”代码,而不模拟“ getHotels”方法的结果?

是的,这是可以实现的,因为您已经提出了:

private final HotelsServiceInt hotelsServiceInt;

您可以在测试类中模拟hotelsServiceInt并返回模拟结果。 在调用doSomeBusinessLogic之前,只需返回一个doSomeBusinessLogic列表即可。 您还需要更改@Mock@InjectMock的变量类型,如下所示:

   @Mock
   var hotelsServiceInitMock: HotelsServiceInt = _
   @InjectMocks
   var hotelsService: HotelsService = _
   //then do this:
   doReturn(list).when(hotelsServiceInitMock).getHotels(
                 Matchers.any(), Matchers.any())

现在您应该能够获得所需的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM