在mockito中模拟通用scala方法

Jon*_*sMH 6 generics unit-testing scala mockito

我正在使用Mockito作为模拟框架的Scala项目.我想模拟以下通用Scala方法:

def parseXml[T: ClassTag](xmlUrl: URL, xsdUrl: Option[URL]): Option[T] 
Run Code Online (Sandbox Code Playgroud)

在嘲笑我假设我可以使用Mockito的匹配器,如下:

when(xmlFileUnmarshallerMock.parseXml[org.mockito.Matchers.any[AddressBook]](org.mockito.Matchers.any[URL], org.mockito.Matchers.any[Option[URL]]))
    .thenReturn(Some(defaultAddressBook))
Run Code Online (Sandbox Code Playgroud)

但它不会编译,然后我尝试使用[Any]和[AddressBook],但两者都会导致以下错误:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException:  Invalid use of argument matchers! 3 matchers expected, 2 recorded.
Run Code Online (Sandbox Code Playgroud)

Dim*_*ima 9

问题是你的parseXml函数实际上需要三个参数,而不是两个,这就是T : ClassTag语法的简写:

def parseXml[T](xmlUrl: URL, xsdUrl: Option[URL])(implicit classTag: ClassTag[T]): Option[T] 
Run Code Online (Sandbox Code Playgroud)

当你试图模仿它时,scala隐含地提供第三个参数,但mockito不接受它,因为它不允许在同一个存根调用中混合匹配器和不匹配.

底线是,您必须明确提供第三个参数,并使其成为匹配器:

when(parseXml[AddressBook](any, any)(any))
  .thenReturn(Some(defaultAddressBook))
Run Code Online (Sandbox Code Playgroud)