Спок: используя макет внутри таблицы предложений "где"?
Я пытаюсь использовать макет объекта в таблице предложения "где". В основном как то так:
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 ответ
Вы можете изменить метод на что-то вроде:
...
inj1.someMethod() >> [mocked] * numReturned
...
then:
numCalled * inj2.someOtherMethod()
where:
numReturned | numCalled
1 | 0
2 | 1
Другими словами, укажите (просто) части в блоке where и соберите их в теле метода. Это общее решение.
Обычно, другое решение - перетасовать объекты, которые будут использоваться в блоке where, в @Shared
поля. Проблема "слишком большой области видимости" может быть смягчена наличием нескольких маленьких спецификаций в одном файле. Тем не менее, это решение не будет работать для макетов, потому что макеты не могут быть @Shared
,