2016-12-27 4 views
2

den folgenden Code gegeben, der eine Scala-Klasse mit Mockito spottet, bekomme ich einen Fehler und kompilieren kann nicht:Mockito: mehrdeutiger Verweis auf überladene Definition

import org.mockito.Mockito._ 

class Testeable { 
    def fun1 = 1 
    def fun2 = 2 
} 

object test { 

    def getMock = { 
     val testMock = mock[Testeable] // <-- this line throws the error 
     when(testMock.fun1).thenReturn(3) 
     testMock 
    } 

} 

Fehler sind:

ambiguous reference to overloaded definition, both method mock in object Mockito of type (x$1: Class[common.Testeable], x$2: org.mockito.MockSettings)common.Testeable and method mock in object Mockito of type (x$1: Class[common.Testeable], x$2: org.mockito.stubbing.Answer[_])common.Testeable match expected type ?

ich nur verspottet eine Klasse, was ist mehrdeutig?

+0

'Mock (Klasse von [Testable])'? Es erwartet eine 'java.lang.Class', und' classOf'-Methode liefert es, genau wie in Java könnte man 'Testable.class' machen. –

+0

Korrektur, Klasse 'Any' hat eine 'getClass'-Methode, für nicht-generische Klassen wie' Int', 'String' usw. können Sie' getClass' verwenden und für generische wie 'List [T]' verwenden Sie 'classOf [List [_]] 'aus' Predef' ... –

+0

danke, es funktionierte mit 'mock (classOf [Testable])' – ps0604

Antwort

3

Sie können Mockito nicht direkt so verwenden (Sie können es verwenden, aber es kann nicht so schön aussehen). Werfen Sie einen Blick auf scala test library. Die einfachste Lösung, die Sie tun können, um Ihr unmittelbares Problem damit zu lösen, ist nur mischen in MockitoSugar in Ihre Testklasse statt Mockito._ importieren, dann mock[Foo] wird nur funktionieren, wie Sie es erwarten. Es gibt viele andere Dinge, die die Bibliothek bietet, um idiomatischen Testcode in scala zu schreiben, also sollten Sie einige Dokumente und Beispiele auf der Seite lesen, mit der ich verlinkt bin.

+0

mit 'mock (classOf [Testable]) scheint zu funktionieren. Gedanken? – ps0604

+0

Es gibt verschiedene überladene Varianten von 'Mock' in' Mockito'. Die parametrisierte, die Sie zuvor hatten, benötigt zwei Argumente. Derjenige, der ein einzelnes 'Class'-Argument verwendet, arbeitet mit der letzteren Syntax. Ich bin mir nicht sicher, was dich davon abhält. – Dima

+0

die gotcha ist, dass scala nicht gut mit Signaturen mit elipsis umgehen und es kann nicht zwischen den beiden unterscheiden. Dies ist ein größeres Problem mit dem Spion/doReturn, der ein AnyVal-Szenario zurückgibt –

Verwandte Themen