我正在使用scalatest,并且在测试代码时,我想替换函数的实现以在运行测试时返回其他内容。
在JavaScript中,它非常简单,我认为我可以在scala中做同样的事情。 所以我想要的是这样的:
object Module {
private def bar(): Int = {
5
}
def foo(): Unit = {
println(bar())
}
}
测试将是这样的(不要介意语法,您就会明白)
class Test extends FunSpec {
mock(Module.bar, () => 1)
describe("Test") {
it("Test") {
Module.foo() // will print 1
}
}
}
我已经搜索了Internet,并遇到了scala模拟库,但是似乎没有一个库能够代替方法的实现。 在每个库中,您都必须在测试中定义模拟并将其传递给代码,但我不想这样做。
反正有实现这一目标的方法吗?
谢谢。
答案 0 :(得分:2)
您无法在Scala中模拟Object
,因为它就像Java中的静态类(您也不能模拟)。 (而且您无法模拟不在mockito或scalamock中(可能在其下一版本中)的scala对象。)
但是,如果将object Module
更改为class Module
,则可以轻松地模拟此功能(使用模仿):
val mockModule = mock[Module]
when(mockModule.bar()).thenReturn(1)
答案 1 :(得分:1)
如果您不想使用模拟,则可以创建一个具有该功能的假类并放入所需的值,如下所示:
trait SMT{
def bar: Int
}
class RealImpl extends SMT{
def bar: Int = 5
}
class FakeImpl extends SMT{
def bar: Int = 1
}