Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mockito matchers, scala value class and NullPointerException

I'm using mockito with scalatest. I have following problem when using matcher with value class.

import org.scalatest.FlatSpec import org.scalatest.mock.MockitoSugar import org.mockito.BDDMockito._ import org.mockito.Matchers.any  case class FirstId(val value: String) extends AnyVal case class SecondId(val value: String) extends AnyVal  trait MockedClass {   def someMethods(firstId: FirstId, secondId: SecondId): Int }  class ValueClassSpec() extends FlatSpec with MockitoSugar {    val mockedClass = mock[MockedClass]   val secondId = SecondId("secondId")    "Matchers" should "work for value class" in {     // given     given(mockedClass.someMethods(any[FirstId], org.mockito.Matchers.eq(secondId))).willReturn(3)     // when     val result = mockedClass.someMethods(FirstId("firstId"), secondId)     // then     assert(result == 3)   }  } 

and the result is:

ValueClassSpec: Matchers - should work for value class *** FAILED ***   java.lang.NullPointerException:   at io.scalac.fow.party.ValueClassSpec$$anonfun$1.apply$mcV$sp(ValueClassSpec.scala:22)   at io.scalac.fow.party.ValueClassSpec$$anonfun$1.apply(ValueClassSpec.scala:20)   at io.scalac.fow.party.ValueClassSpec$$anonfun$1.apply(ValueClassSpec.scala:20)   at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)   at org.scalatest.Transformer$$anonfun$apply$1.apply(Transformer.scala:22)   at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85)   at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)   at org.scalatest.Transformer.apply(Transformer.scala:22)   at org.scalatest.Transformer.apply(Transformer.scala:20)   at org.scalatest.FlatSpecLike$$anon$1.apply(FlatSpecLike.scala:1639)   ... 

I found similar question (Scala Value classes and Mockito Matchers don't play together) but without any advice.

Is there any posibility to use mockito matchers with scala value class?

Lib versions: scala 2.11.2, mockito 1.10.8, scalatest 2.1.6

like image 203
Marek Kliś Avatar asked Dec 04 '14 08:12

Marek Kliś


1 Answers

The proper solution is:

case class StringValue(val text: String) extends AnyVal case class LongValue(val value: Long) extends AnyVal  val eqFirst: StringValue = StringValue(org.mockito.Matchers.eq("first")) val anySecond: StringValue = StringValue(org.mockito.Matchers.any[String])  val eqFirst: LongValue = LongValue(org.mockito.Matchers.eq(1L)) val anySecond: LongValue = LongValue(org.mockito.Matchers.any[Long]) 
like image 82
Marek Kliś Avatar answered Sep 20 '22 00:09

Marek Kliś