【问题标题】:Mocking case classes with primitive types具有原始类型的模拟案例类
【发布时间】:2018-07-13 03:44:47
【问题描述】:

考虑以下类型结构:

trait HasId[T] {
    def id: T
}

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

假设我们想在某个测试中模拟实体类。

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

播放这样的测试会导致抛出 NullPointerException(在第二行),可能是因为 scala 编译器的包装原始类型的行为(如果我们将 Long 替换为 String,测试会正确执行)。

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)

此错误仅影响案例类和 2.X 版本中的 mockito。

是否有任何已知的解决方案来处理这个问题?

更新:2.0.8-beta 之后的版本出现问题

【问题讨论】:

    标签: scala unit-testing mockito scalatest


    【解决方案1】:

    这是我的测试类:

    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]
    

    这是我的 sbt 文件:

    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
    

    编译通过,成功。

    【讨论】:

    • 事实证明,mockito 2.0.8-beta 版是最后一个,它可以正常工作 - 每个新版本都失败
    • 它实际上并没有回答我的问题,只是该库的 beta 版本中还没有出现问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多