重新模拟模拟函数
Remocking a mock function
说我有特质:
trait A {
def a(): Boolean
}
模拟 + 测试用例:
trait Fixture {
val mockA = mock[A]
(mockA _).returns(true)
}
"mock must return true" in new Fixture {
mockA() must equal(true)
}
现在,我想将同一测试套件中的单个测试的值重新模拟为 false
trait ChildFixture extends Fixture {
(mockA _).returns(false) // this obviously doesn't work
}
"mock must return false" in new ChildFixture {
mockA() must equal(false)
}
这是一个非常简单的示例,我有一个复杂的模拟装置依赖链。显而易见的答案是将 mockA
的模拟代码提取到另一个夹具中,然后混合到应该为真的代码中,然后为应该为假的特定测试制作一个新的夹具。唯一的问题是,鉴于我的测试代码,这是一个繁重的过程。也可以用匿名class和var手动模拟return,但是这样看起来不是很优雅,失去了Scala模拟调用验证的功能。
是否可以为单个测试重新插入一个已经模拟的对象?
如果您有 "complex dependency" 个模拟,那么我建议您可以安全地覆盖 def
而不是 val
这些模拟,因为您会调用 assign可能重写后手动将结果 val
。此外,对此类模拟的所有更改都可以在代码块中进行:
trait A {
def a(): Boolean
}
trait B {
def b(): B
}
trait Fixture {
def createMockA(): A = {
val mocked = mock[A]
(mocked.a _) returns true
mocked
}
def createMockB(): B = {
val mocked = mock[B]
(mocked.b _) returns createMockA
mocked
}
}
trait FixtureChild extends Fixture {
override def createMockA(): A = {
val mocked = mock[A]
(mocked.a _) returns false
mocked
}
}
"value must be overriden" in new FixtureChild {
val b = createMockB()
b.b().a() must beFalse
}
但是,如果您有 "complex dependency chain of a mocking fixtures",我会将其视为代码需要重构的危险信号。
说我有特质:
trait A {
def a(): Boolean
}
模拟 + 测试用例:
trait Fixture {
val mockA = mock[A]
(mockA _).returns(true)
}
"mock must return true" in new Fixture {
mockA() must equal(true)
}
现在,我想将同一测试套件中的单个测试的值重新模拟为 false
trait ChildFixture extends Fixture {
(mockA _).returns(false) // this obviously doesn't work
}
"mock must return false" in new ChildFixture {
mockA() must equal(false)
}
这是一个非常简单的示例,我有一个复杂的模拟装置依赖链。显而易见的答案是将 mockA
的模拟代码提取到另一个夹具中,然后混合到应该为真的代码中,然后为应该为假的特定测试制作一个新的夹具。唯一的问题是,鉴于我的测试代码,这是一个繁重的过程。也可以用匿名class和var手动模拟return,但是这样看起来不是很优雅,失去了Scala模拟调用验证的功能。
是否可以为单个测试重新插入一个已经模拟的对象?
如果您有 "complex dependency" 个模拟,那么我建议您可以安全地覆盖 def
而不是 val
这些模拟,因为您会调用 assign可能重写后手动将结果 val
。此外,对此类模拟的所有更改都可以在代码块中进行:
trait A {
def a(): Boolean
}
trait B {
def b(): B
}
trait Fixture {
def createMockA(): A = {
val mocked = mock[A]
(mocked.a _) returns true
mocked
}
def createMockB(): B = {
val mocked = mock[B]
(mocked.b _) returns createMockA
mocked
}
}
trait FixtureChild extends Fixture {
override def createMockA(): A = {
val mocked = mock[A]
(mocked.a _) returns false
mocked
}
}
"value must be overriden" in new FixtureChild {
val b = createMockB()
b.b().a() must beFalse
}
但是,如果您有 "complex dependency chain of a mocking fixtures",我会将其视为代码需要重构的危险信号。