2016-08-18 6 views
2

Я работаю над проектом Scala, используя Mockito как насмешливую структуру. Я хотел поиздеваться следующий обобщенный метод Scala:Mocking generic scala method in mockito

def parseXml[T: ClassTag](xmlUrl: URL, xsdUrl: Option[URL]): Option[T] 

Когда насмехаясь я предполагал, что я мог бы использовать на из matchers Mockito как так:

when(xmlFileUnmarshallerMock.parseXml[org.mockito.Matchers.any[AddressBook]](org.mockito.Matchers.any[URL], org.mockito.Matchers.any[Option[URL]])) 
    .thenReturn(Some(defaultAddressBook)) 

Но это не компилируется, то я пробовал как с помощью [Любой] и [AddressBook], но оба результата в следующей ошибке:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 3 matchers expected, 2 recorded. 

ответ

4

проблема заключается в том, что ваша parseXml функция фактически принимает три аргумента, а не два, это то, что T : ClassTag синтаксис представляет собой сокращенный:

def parseXml[T](xmlUrl: URL, xsdUrl: Option[URL])(implicit classTag: ClassTag[T]): Option[T] 

Когда вы пытаетесь дразнить его, неявно предоставляет Scala третьего параметра, но Mockito не принимает его, потому что он не позволяет смешивания matchers и не-матчей в том же прерывистый вызов.

Суть заключается в том, что вы должны предоставить третий параметр в явном виде, и сделать его Сличитель:

when(parseXml[AddressBook](any, any)(any)) 
    .thenReturn(Some(defaultAddressBook))