【问题标题】:How to use mocks in Scala to mock a singleton object如何在 Scala 中使用模拟来模拟单例对象
【发布时间】:2016-04-04 22:39:58
【问题描述】:

我最近开始使用 Scala 进行编程。我有一个项目,其中包含相互调用的类层次结构。最终,他们最后调用了一个单例 DAL(数据访问层)对象,该对象调用 MySQL 中的存储过程。

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

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

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

如何为 DAL 对象创建模拟?如何将它注入到流程管道中,或者有更好/推荐的方法来用只返回过程名称而不是调用它的模拟替换单例?

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

【问题讨论】:

    标签: scala testing mocking mockito scalatest


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

      干杯

      【讨论】:

      • 如果我可以问,这有什么帮助?我想获取存储过程的名称,而不是实际调用它。间谍不会这样做。模拟仍然需要通过所有层进行注入。如果我错了,请纠正我?
      • 是的,mock[DAL.type] 确实需要注入,就像 Dima 向您展示的那样,但不必为特性而烦恼。 spy(DAL) 实际上与您无关,因为它实际上会计算函数。我编辑我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2016-10-24
      • 2017-05-30
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      相关资源
      最近更新 更多