我想将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)
有没有办法实现这个目标?
答案 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)
正如在其他问题here和here中所建议的,我们可以将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
。