Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocking case classes with primitive types

Consider following types structure:

trait HasId[T] {
    def id: T
}

case class Entity(id: Long) extends HasId[Long]

Let's say, we want to mock Entity class in some test.

val entityMock = mock[Entity]
Mockito.when(entityMock.id).thenReturn(0)

Playing such test results in throwing NullPointerException (in second line), probably because of scala compiler behaviour with wrapping primitive types (if we replace Long with String, test executes correctly).

An exception or error caused a run to abort. 
java.lang.NullPointerException
at com.test.Entity$MockitoMock$1085095743.id(Unknown Source)
at com.test.Test.<init>(Test.scala:23)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.scalatest.tools.Runner$.genSuiteConfig(Runner.scala:1422)
at org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$8(Runner.scala:1236)

This error affects only case classes, and mockito in 2.X versions.

Is there any known solution to handle this issue?

UPDATE: problem occurs in versions newer than 2.0.8-beta

like image 278
mnowak Avatar asked Nov 08 '22 11:11

mnowak


1 Answers

Here is my test class:

import org.mockito.Mockito._
import org.scalatest.mockito.MockitoSugar
import org.scalatest.FlatSpec

class StackOverflowTest extends FlatSpec with MockitoSugar {

  "Bla" should
    "fsg ll ll" in {
      val entityMock = mock[Entity]
      when(entityMock.id).thenReturn(0)
      foo(entityMock)
    }

  def foo(entity: Entity) = {
    entity.id == 0
  }

}

trait HasId[T] {
  def id: T
}

case class Entity(id: Long) extends HasId[Long]

Here is my sbt file:

name := "scalaExperiments"

version := "0.1"

scalaVersion := "2.12.4"

libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.4" % Test

libraryDependencies += "org.mockito" % "mockito-all" % "2.0.2-beta" % Test

Compiles and passes successfully.

like image 173
Varvarigos Emmanouil Avatar answered Nov 14 '22 22:11

Varvarigos Emmanouil