如何在 Scala 中模拟静态方法?

问题描述 投票:0回答:1

我在 scala 中有一个静态方法,静态方法我的意思是说这个方法在一个名为 MyObject 的对象中。我还有一个名为 MyClass 的类,其中有一个方法在内部调用 MyObject 的方法。我想为 MyClass 编写单元测试并想模拟 MyObject 的方法。我怎样才能在 Scala 中做到这一点?

class MyClass {

  def callMyObject(): String = MyObject.myMethod()

}

object MyObject {

  def myMethod(): String = "Original method"

}

我希望当我调用 MyClass 的 callMyObject() 时它应该返回一个模拟值而不是“原始方法”

我正在尝试 mockStatic 和间谍但没有帮助。

scala unit-testing powermock powermockito scalatest-maven-plugin
1个回答
0
投票

此代码需要进行一些重构以使其可测试。

首先,使

MyObject
扩展一个特征。比方说
MyGenericObject
.

trait MyGenericObject {
    def sayMyName: Unit
}

object MyObject extends MyGenericObject{
    def sayMyName: Unit = println("foo bar") 
}

然后重构

MyClass
以接受
myObj: MyGenericObject
.

class MyClass(myObj: MyGenericObject) {
    def saySomeonesName: Unit = myObj.sayMyName
}

现在进行测试

MyClass
,您可以创建一个新对象
MyTestObject
,它将扩展
MyGenericObject
,以便我们可以将它传递给
MyClass
.

object MyTestObject extends MyGenericObject {
    def sayMyName: Unit = println("test bar") 
}

现在进行测试。

val myClass = new MyClass(MyObject)
myClass.saySomeonesName
// Output: foo bar

val myTestClass = new MyClass(MyTestObject)
myTestClass.saySomeonesName
// Output: test bar
© www.soinside.com 2019 - 2024. All rights reserved.