我想用依赖项存根 scala 类的方法之一。有没有办法使用 ScalaMock 来实现这一点?
这是我所拥有的一个简化示例:
class TeamService(val dep1: D1) {
def method1(param: Int) = param * dep1.magicNumber()
def method2(param: Int) = {
method1(param) * 2
}
}
在这个例子中,我想嘲笑method1()
.我的测试如下所示:
val teamService = ??? // creates a stub
(teamService.method1 _).when(33).returns(22)
teamService.method2(33).should be(44)
有没有办法实现这一目标?
正如其他问题中所建议的,在这里和这里,我们可以将stub
与最终结合起来。来自 ScalaMock FAQ
我可以模拟最终/私人方法或课程吗?
这不受支持,因为使用宏生成的模拟是作为要模拟类型的子类实现的。因此,私有方法和最终方法不能被覆盖
因此,您可以将源代码中的method2
声明为 final,然后测试:
it should "test" in {
val teamService = stub[TeamService]
(teamService.method1 _).when(33).returns(22)
teamService.method2(33) shouldBe 44
}
或者,创建一个新的重写类,将方法声明为 final:
it should "test" in {
class PartFinalTeamService(dep: D1) extends TeamService(dep) {
override final def method2(param: Int): Int = super.method2(param)
}
val teamService = stub[PartFinalTeamService]
(teamService.method1 _).when(33).returns(22)
teamService.method2(33) shouldBe 44
}
你必须模拟dep1: D1
,所以一切都会顺利进行。模拟"一半"或仅模拟某些方法不是一个好方法。
嘲笑dep1: D1
是测试它的正确方法。
val mockD1 = mock[D1]
val teamService = new TeamService(mockD1)
(mockD1.magicNumber _).returns(22)
teamService.method2(33).should be(44)
您可以在创建TeamService
对象时覆盖method1()
,并使其返回所需的任何值。
val service = new TeamService(2) {
override def method1(param: Int): Int = theValueYouWant
}
并使用service
对象来测试您的method2()
。