Я начал писать свой собственный MockSetter, чтобы делать несколько основных макетов перед каждым тестом, чтобы в каждом из них можно было изменить один из них или добавить новый. Трейт для Spec выглядит так:
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 методов, для каждого теста мне нужно написать моки для каждого метода и изменить только то, что нужно.
Было бы неплохо сделать это с помощью базовой настройки и изменить в соответствии с конкретным тестом.