如何在 Scala 中使用模拟来模拟单例对象

How to use mocks in Scala to mock a singleton object

我最近开始使用 Scala 编程。我有一个项目,该项目具有相互调用的 classes 层次结构。最终,他们最后一个调用单例 DAL(数据访问层)对象,该对象调用 MySQL.

中的存储过程

我有一个具有以下签名的 DAL 对象:

def callStoredProcedure(procName: String, params: Array[String]): Boolean

我想编写一个调用顶层函数的测试 class,并检查 procName 传递给该函数的内容。

如何为 DAL 对象创建模拟?我怎样才能将它注入流程管道,或者是否有一种 better/recommended 方法可以用一个模拟来替换单例,该模拟只是 returns 过程名称而不是调用它?

我们目前正在使用 Mockito,但我对任何事情都持开放态度。

不要直接使用单例,那不是一个好主意。你知道为什么?因为你不能模拟它们进行单元测试,呃。 改为将其作为 class 的参数:

trait DAL {
  def callStoredProcedure(procName: String, params: Array[String]): Boolean       
}

object DALImpl extends DAL {
    def callStoredProcedure(procName: String, params: Array[String]): Boolean = doStuff
}

class Foo(dal: DAL = DALImpl) 

val testMe = new Foo(mock[DAL])

class Foo {
    def dal: DAL = DALImpl
}

val testMe = new Foo {
  override def dal = mock[DAL]
}

你可以这样做:

class Foo(dal: DAL)

val testMe = new Foo(dal = mock[DAL.type])

干杯