scala - 如何通过模拟嵌套方法来测试方法?
问题描述
我正在尝试从一些计算中测试一个Object.method
包含一些嵌套方法的方法。Trait
必须模拟这些嵌套方法(它们访问数据库,所以我想模拟它们的响应)。
当我调用 realObject.method
时,它应该跳过嵌套方法调用并检索我想要的。我试过嘲笑他们,但测试仍然在打电话给他们。
这是我的示例源代码:
trait MyTrait {
def myMethodToMock(a: String): String
}
object MyObject extends MyTrait {
def myParentMethod(a:String) = {
val b = myMethodToMock(a)
val c = a + b
c
}
}
然后在我的测试中:
val myTraitMock = mock[MyTrait]
when(myTraitMock.myMethodToMock(a)).thenReturn(b)
//Then I call the parent method:
assert(MyObject.myParentMethod(a) equals c)
它会抛出 NullPointerException,因为它仍在访问myMethodToMock
解决方案
您的代码无法编译,所以我将猜测您在这里实际尝试做的一些事情......
您正在模拟一个方法,然后在一个完全不相关的实例上调用它。难怪它不起作用。
一个好的经验法则(和最佳实践)是永远不要模拟您实际测试的课程。将您想要模拟和测试的所有内容分开到一个单独的类中。这也称为单一责任原则(每个组件应该对单一事物负责)。
trait MyTrait {
def myMethodToMock(a: String): String
}
object MyTrait extends MyTrait {
def myMethodtoMock(a: String) = ???
}
class MyObject(helper: MyTrait = MyTrait) {
def myParentMethod(a: String) = a + helper.myMethodToMock(a)
}
object MyObject extends MyObject()
现在,您可以像这样编写测试:
val myTraitMock = mock[MyTrait]
when(myTraitMock.myMethodToMock(any)).thenReturn("b")
new MyObject(myTraitMock).myParentMethod("a") shouldBe "ab"
verify(myTraitMock).myMethodToMock("a")
这里的主要区别是您将模拟传递给对象的构造函数,因此当它调用该方法时,它将是您存根的方法,而不是默认类提供的实现。
推荐阅读
- scripting - Adobe InDesign 脚本仅影响选定的表格/文本框架
- chart.js - 如何使用 ChartJS v3 创建一个简单的仪表?
- java - 如何告诉 Java 使用哪个接口来发送多播数据
- javascript - 有什么方法可以检查是否在 iframe 中单击了按钮
- node.js - AWS Lambda with Node - 将文件保存到 Lambda 的文件系统中
- r - 如何根据预算找到最大的总和值
- ios - 在 UI 测试 Swift 中处理来自 API 的答案
- jenkins - 如果在该阶段后期确定输入无效,如何重试 groovy 管道中的输入步骤?
- linux - 如何在 Vim 中进行搜索和替换?
- r - 在两个公共列 R 的匹配值上连接两个数据帧