[英]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.