Спок: используя макет внутри таблицы предложений "где"? - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь использовать ia mocked объект в таблице предложения where. В основном как то так:

def "my test"(){

    given:
    InjectedObject1 inj1 = Mock()
    InjectedObject2 inj2 = Mock()
    SystemUnderTest system = new System(inj1, inj2)
    MockedObject mocked = Mock()

    inj1.someMethod() >> list  // this will be a list of MockedObject

    when:
    system.execute()

    then:
    n * inj2.someOtherMethod()

    where:
    list             | n
    [mocked]         | 0
    [mocked, mocked] | 1
}

Это не работает, потому что предложение "where" выполняется перед предложением "дали", поэтому mocked еще не существует, когда на него впервые ссылаются. Как мне это преодолеть? mocked используется только этот тест, поэтому я бы хотел избежать его создания вне этого метода.

Обратите внимание, что это упрощенный пример, на самом деле больше взаимодействий и других столбцов в таблице, которые влияют на n - что делает синтаксис таблицы очень удобным.

1 Ответ

2 голосов
/ 25 января 2012

Вы можете изменить метод на что-то вроде:

...
inj1.someMethod() >> [mocked] * numReturned
...
then:
numCalled * inj2.someOtherMethod()

where:
numReturned | numCalled
1           | 0
2           | 1

Другими словами, укажите (просто) части в блоке where и соберите их в теле метода. Это общее решение.

Обычно другое решение состоит в том, чтобы перетасовать объекты, которые будут использоваться в блоке where, в поля @Shared. Проблема «слишком большой области видимости» может быть смягчена наличием нескольких маленьких спецификаций в одном файле. Однако это решение не будет работать для макетов, потому что макеты не могут быть @Shared.

...