2013-11-14 10 views
9

Mit Scala Wertklassen mit Mockito Mocks (Matcher) führt zu einer Nullpointer finden Sie in diesem Beispiel:Scala Wertklassen und Mockito Matchers nicht spielen zusammen

import org.scalatest.FunSuite 
import org.scalatest.mock.MockitoSugar._ 
import org.mockito.{Matchers, Mockito} 

class Id(val underlying: Int) extends AnyVal 

class MockitoValueClassSuite extends FunSuite { 

    trait Sample { 
    def doIt(id: Id) : Int 
    } 

    test("Check value classes in scala with mockito") { 
    val sampleMock = mock[Sample] 

    val id = new Id(1) 

    Mockito.when(sampleMock.doIt(Matchers.eq(id))).thenReturn(5) 

    assert(sampleMock.doIt(id) == 5) 
    } 
} 

Ergebnisse in:

java.lang.NullPointerException was thrown. 
java.lang.NullPointerException 
    at net.gutefrage.service.user.service.MockitoValueClassSuite$$anonfun$1.apply$mcV$sp(MockitoValueClassSuite.scala:21) 
    at net.gutefrage.service.user.service.MockitoValueClassSuite$$anonfun$1.apply(MockitoValueClassSuite.scala:16) 
    at net.gutefrage.service.user.service.MockitoValueClassSuite$$anonfun$1.apply(MockitoValueClassSuite.scala:16) 
    at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22) 

Irgendwelche Hinweise, was hier gemacht werden kann?

Antwort

4

Angenommen, die NPE passiert auf der Mockito.When-Linie würde ich raten, weil die Wertklassen implementiert werden, als tatsächlich um die primitive übergeben und dann ersetzt Methode mit statischen Methoden aufrufen, während Mockito gleich nennen will auf ein Objekt oder etwas Ähnliches. Wenn das der Grund ist, dann könntest du vielleicht deinen eigenen Matcher in Scala implementieren, um es zu umgehen.

+3

Wie ich jetzt herausgefunden, es auf "Matchers.eq (id)", wie Mockito geschieht versucht, einen Standardwert für die Id-Wertklasse zu ermitteln, die null ist, da sie zur Laufzeit java.lang.Object erweitert und der Standardwert für Objects null ist. Der Compiler dagegen möchte ein "primitives int" haben, um in eine scala.Int zu "boxen" – longliveenduro

1

In Ihrem Fall haben Sie so etwas wie diese verwenden:

Mockito.when(sampleMock.doIt(Id(Matchers.eq(id)))).thenReturn(5) 

oder

Mockito.doReturn(5).when(sampleMock).doIt(Id(Matchers.eq(id))) 
Verwandte Themen