2013-11-14 12 views
9

Korzystanie Klasy wartości Scala z Mockito kpi (dopasowujących) rezultaty w formie NullPointerException, patrz poniższy przykład:klasy Scala Wartość i Mockito dopasowujących nie grają razem

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) 
    } 
} 

Skutkuje:

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) 

Jakieś wskazówki, co można tutaj zrobić?

Odpowiedz

4

Zakładając, że NPE dzieje się na linii Mockito.when, domyślam się, że dzieje się tak dlatego, że klasy wartości są zaimplementowane jako faktyczne przechodzenie wokół pierwotnej, a następnie zastępującej metody, która wywołuje ją statycznymi metodami, podczas gdy Mockito chce wywoływać równe wartości. na obiekcie lub coś w tym stylu. Jeśli to jest powód, być może mógłbyś zaimplementować swój własny matcher w Scali, aby obejść go.

+3

Jak dowiedział się teraz, to dzieje się na "Matchers.eq (id)" jako Mockito próbuje ustalić domyślną wartość dla klasy wartości Id, która ma wartość null, ponieważ w czasie wykonywania rozszerza java.lang.Object, a wartość domyślna dla obiektów ma wartość null. Z drugiej strony kompilator chce mieć "prymitywne int", aby "zapakować" w scala.Int – longliveenduro

1

W twoim przypadku, trzeba użyć czegoś takiego:

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

lub

Mockito.doReturn(5).when(sampleMock).doIt(Id(Matchers.eq(id))) 
Powiązane problemy