Scala Mock部分剔除

时间:2016-01-26 14:50:50

标签: scala unit-testing scalamock

我想将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)

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:0)

你必须模仿dep1: D1,所以一切都会好起来的。模仿“一半”或只是一些方法不是一个好方法。

模拟dep1: D1是测试它的正确方法。

val mockD1 = mock[D1]
val teamService = new TeamService(mockD1)
(mockD1.magicNumber _).returns(22)
teamService.method2(33).should be(44)

答案 1 :(得分:0)

正如在其他问题herehere中所建议的,我们可以将stub与final结合起来。来自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
}

答案 2 :(得分:0)

您可以在创建 export default { data() { const selectedGames = [ {id: 1, name: "ABC"}, {id: 2, name: "DEF"}, {id: 3, name: "GHI"}, {id: 4, name: "ABC"}, ] return { selectedGames, selectedGame: selectedGames[0] } }, watch: { async selectedGame(selectedGame) { await fetch('/api/select/' + selectedGame.id) //... } } } 对象时覆盖 method1() 并使其返回您想要的任何值。

TeamService

并使用 val service = new TeamService(2) { override def method1(param: Int): Int = theValueYouWant } 对象来测试您的 service