斯卡拉模拟部分存根



我想用依赖项存根 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()

相关内容

  • 没有找到相关文章

最新更新