我有一个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对象。
答案 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模式,应该感觉非常舒服。