Scala mock:在对象内部启动其他类实例时调用spy mock的实例

Scala mock:在对象内部启动其他类实例时调用spy mock的实例,scala,unit-testing,mockito,scalatest,scalamock,Scala,Unit Testing,Mockito,Scalatest,Scalamock,我在scala中有一个名为SomeClass的类&SomeClass对象。 现在我需要模拟在SomeClass对象中实例化的OtherClass class SomeClass { import SomeClass._ def doSomething(param1:Map[String,String],param2:Int) :String{ val returnForSomething= instanse.oth

我在scala中有一个名为SomeClass的类&SomeClass对象。 现在我需要模拟在SomeClass对象中实例化的OtherClass

    class SomeClass {
            import SomeClass._
            def doSomething(param1:Map[String,String],param2:Int) :String{ 
            val returnForSomething= instanse.otherClassFuntion(param2)
        .....
         }

            def doSomethingElse(param:Int) :Map[String,String]{ 
           val returnForSometingElse= instanse.otherClassFuntion(param)
        ....
        }

    object SomeClass{
        lazy val instance =new OtherClass
     }
我用scala mockito sugar来模拟另一个类试图监视另一个类,但当我打电话时

 val instance = spy(new OtherClass)

但是当对象调用SomeClass对象中的新实例时,如何传递此实例

您不能在
对象
中模拟值。它们没有允许您注入依赖项的构造函数。它们的作用与使用静态方法的类相同

    class SomeClass {
            import SomeClass._
            def doSomething(param1:Map[String,String],param2:Int) :String{ 
            val returnForSomething= instanse.otherClassFuntion(param2)
        .....
         }

            def doSomethingElse(param:Int) :Map[String,String]{ 
           val returnForSometingElse= instanse.otherClassFuntion(param)
        ....
        }

    object SomeClass{
        lazy val instance =new OtherClass
     }
如果确实需要此功能,则必须创建某种setter,以允许覆盖
实例

object SomeClass {
  private var _instance = new OtherClass

  def instance = _instance

  // put your package name in []
  private[thispackage] def instance_=(newInstance: OtherClass) = _instance = OtherClass
  // to make it accessible only within thispackage and its subpackages
}
然而,考虑到:

  • object
    s是全局的(就像Java中的
    static
    方法一样)
  • 全局可变状态几乎总是坏的
  • 因此,如果您想编写可测试代码,那么
    对象
    s(和
    静态
    方法)应该是无状态的
这个用例有点不对劲<代码>实例不应要求模拟、伪造或监视。如果是,则不应将其用作
SomeClass
中的全局值,而是通过构造函数传递的默认值,可以替换为:

class SomeClass(instance: OtherClass = SomeClass.instance) {
  ...
}
或者类似的