模拟Scala对象和函数

时间:2017-04-18 15:09:41

标签: scala unit-testing mocking

我有一个Scala对象,它包含一些实用程序功能。这些函数由同一对象中存在的其他函数或其他类/对象调用。是否可以模拟这个对象或函数,以便我可以对它们被调用的类进行单元测试。

示例:

object Util {
  
  def methodA() = { 
    //other code
    methodB() 
    //other code
  }
  
  def methodB() = { 
    //other code
    methodC() 
    //other code
  }
  
  def methodC() = { ... }

}

在这里,我从另一个类

调用对象函数

class Data {
  
  //other code
  
  def call() = {
    //other code
    Util.methodA()
    //other code
  }
}

如何进行单元测试类Data的函数调用()?在Java中,我可以为Util创建一个模拟对象,并设置对methodA()调用的期望,但这在Scala中是不可能的,因为没有模拟库支持模拟Scala对象。

1 个答案:

答案 0 :(得分:6)

在某种意义上,问题在于您使用的模式类似于Java中的静态类。你不能模拟静态类,这就是Java模式通常不支持这种方法的原因。

另一方面,在Scala中你可以。 Make Util扩展了一个特征并实现它。

trait UtilityMethods {
 def methodA()
 def methodB()
}

object Utils extends UtilityMethods {
  def methodA() = {}
  def methodB() = {}
}

然后在你的测试中:

val mockedUtils = mock[UtilityMethods]

(使用mockito)。显然你必须在你的代码而不是Utils周围传递UtilityMethods,就像你在Java中使用接口一样。

通常,您也可以使用隐式作用域来注入函数,从而在没有类似静态的对象方法的情况下模拟这些依赖项,但上面的内容非常接近Java模式,应该感觉非常舒服。