Mocking case classes with primitive types

给你一囗甜甜゛ 提交于 2019-12-06 02:18:36

问题


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


回答1:


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.



来源:https://stackoverflow.com/questions/48586094/mocking-case-classes-with-primitive-types

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!