我开始编写自己的MockSetter,在每次测试之前进行一些基本的模拟,在每次测试中都可以更改它们或添加新的模拟。 规范的特征如下所示:
trait MocksSetter extends MockFactory with BeforeAndAfterEach { self: Suite =>
type PositionWithMockTuple = (Int, (() => CallHandler[Any]))
private var standardMocks: Seq[PositionWithMockTuple] = Seq.empty
def setupStandardMocks(mocks: Seq[PositionWithMockTuple]) = {
standardMocks = mocks
}
//Replaces current standard mock in a given position
def replaceMock(position: Int, newMockedFunc: () => CallHandler[Any]) = {
val updatedMocks = standardMocks.map {
case (pos, _) if pos == position => (pos, newMockedFunc)
case (pos, mf) => (pos, mf)
}
standardMocks = updatedMocks
}
//Puts new mock in the end
def insertMock(newMockedFunc: () => CallHandler[Any]) = {
standardMocks = standardMocks :+ ((standardMocks.last._1 + 1, newMockedFunc))
}
override def beforeEach(): Unit = {
standardMocks.foreach {
case (_, mockFunc) => mockFunc().once()
}
super.beforeEach()
}
}
但是当我尝试通过模拟时:
[error] found : org.scalamock.handlers.CallHandler[Boolean]
[error] required: org.scalamock.handlers.CallHandler[Any]
[error] Note: Boolean <: Any, but class CallHandler is invariant in type R.
[error] You may wish to define R as +R instead. (SLS 4.5)
[error] setupStandardMocks(Seq((1, () => someMethodMock(false))))
有可能实现这一目标吗? 我的想法很简单,在所有测试之前保存基本的模拟,这些模拟在每次测试之前执行(通过使用.once()
(。当然,不同的规格可能彼此不同,并且在进行测试时,每个测试中都会重复大量代码。例如,如果里面有 10 个方法,对于每个测试,我需要为每个方法编写模拟,并且只更改需要的内容。
最好使用基本设置并根据特定测试进行更改。
好的解决方案可以用更简单的方式完成。 在规范中,我们可以创建带有参数的抽象类。 我们将通过做来运行规范
"x y z" in new StandardMocks(onlyOneParamChanged = "xyz") {
...
}
当然,类参数将具有默认值,我们可以轻松覆盖这些默认值。 在课堂上通过 takich 参数做嘲笑的东西,仅此而已。