Я пытаюсь понять что-то о взаимодействиях Спока в Groovy unit test.
У меня есть следующие типы:
public interface Bar {
public String getMessage();
}
public class Foo {
private Bar bar;
public void setBar(Bar bar) {
this.bar = bar;
}
public String getMessage() {
return bar.getMessage();
}
}
а затем я написал следующий тест Groovy/Spock:
class FooSpec extends Specification {
private Bar bar;
private Foo foo;
def setup() {
bar = Mock(Bar) { getMessage() >> "hello" }
foo = new Foo()
foo.bar = bar
}
def "say hello"() {
expect:
foo.message.equals("hello")
}
def "say goodbye"() {
setup:
bar.getMessage() >> "goodbye"
expect:
foo.message.equals("goodbye")
}
}
Код создает экземпляр mock Bar в настройке, инициализирует Bar.getMessage(), чтобы вернуть hello, и присваивает это новому экземпляру Foo.
Первый тест проверяет, что foo.getMessage() равно hello.
Второй тест пытается изменить макет Bar, чтобы метод getMessage возвращал goodbye. Затем мы ожидаем, что foo.getMessage() (который делегирует Bar.getMessage()) будет возвращать goodbye. Однако тест не выполняется следующим образом:
FooSpec: попрощаться: 26 Состояние не выполнено
потому что foo.message по-прежнему равен hello.
Я также пробовал следующее:
def "say goodbye"() {
when:
bar.getMessage() >> "goodbye"
then:
foo.message.equals("goodbye")
}
и
def "say goodbye"() {
when:
no_op()
then:
bar.getMessage() >> "goodbye"
foo.message.equals("goodbye")
}
Но оба отказались с тем же приветствием, но не совпадают с прощальным сообщением.
Возможно, я все еще думаю в режиме Mockito и предполагаю, что взаимодействие является эквивалентом выражения when(...).thenReturn(...), и что последующие взаимодействия будут отменять предыдущие взаимодействия.
Существует ли простой способ использования Spock для объявления взаимодействия в методе setup, а затем переопределить это взаимодействие в тестовом случае? Или мне нужно удалить метод setup() и в основном добавить блок setup: к каждому тестовому примеру?