scalamock создает базовые настройки и легко их изменяет

Я начал писать свой собственный 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 методов, для каждого теста мне нужно написать моки для каждого метода и изменить только то, что нужно.

Было бы неплохо сделать это с помощью базовой настройки и изменить в соответствии с конкретным тестом.


person FrancMo    schedule 04.12.2019    source источник


Ответы (1)


Хорошо, решение можно сделать проще. В спецификации мы можем создать абстрактный класс с параметрами. Мы запустим спецификацию, выполнив

"x y z" in new StandardMocks(onlyOneParamChanged = "xyz") {
...
}

Конечно, параметры класса будут иметь значения по умолчанию, которые мы можем легко переопределить. Внутри класса делаем издевательские вещи по таким параметрам и все.

person FrancMo    schedule 04.12.2019