page mockfactory libreria home docs scala mockito scalatest

mockfactory - Matchers de Mockito, clase de valor de scala y NullPointerException



mockito home page (5)

Estoy usando mockito con scalatest. Tengo el siguiente problema al usar el emparejador con la clase de valor.

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

y el resultado es:

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

Encontré una pregunta similar (las clases de Scala Value y Mockito Matchers no juegan juntas ) pero sin ningún consejo.

¿Hay alguna posibilidad de usar mockito matchers con la clase de valor scala?

Versiones lib: scala 2.11.2, mockito 1.10.8, scalatest 2.1.6


Encontré solución:

val anyFirstId: FirstId = any[String].asInstanceOf[FirstId] val eqSecondId: SecondId = org.mockito.Matchers.eq[String](secondId.value).asInstanceOf[SecondId] given(mockedClass.someMethods(anyFirstId, eqSecondId)).willReturn(3)


Esto funciona para todo tipo de clases de valor extends AnyVal y no necesita emparejadores especiales tampoco:

given(mockedClass.someMethods(FirstId(anyString), SecondId(org.mockito.Matchers.eq(secondId.value)))).willReturn(3)


La solución adecuada es:

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


La versión más reciente de mockito-scala (0.0.9) admite esto de forma inmediata, puedes hacer algo como

when(myObj.myMethod(anyVal[MyValueClass]) thenReturn "something" myObj.myMethod(MyValueClass(456)) shouldBe "something" verify(myObj).myMethod(eqToVal[MyValueClass](456))

Descargo de responsabilidad: soy un desarrollador de esa biblioteca