спок издевается: захватить аргумент и возвращаемое значение заглушки - может быть отдельно?

У меня есть тест, который требует:

  1. проверка взаимодействия (метод был вызван и с правильными аргументами)
  2. макет должен возвращать какое-то доброкачественное возвращаемое значение, чтобы не вызывать никаких побочных эффектов.

Прилагаемый код делает это, но мне интересно, есть ли более читаемый способ сделать это. В частности, я думаю, что было бы хорошо отделить насмешливые биты (№1) от битов-заглушек (№2).

Какие-либо предложения?

Спасибо!

def "foo"() {
    setup:
    Payload payload
    Collaborator mock = Mock()
    underTest.collaborator = mock

    when: "doing something"
    underTest.doSomething()

    then: "collaborator's func is called once"
    1 * mock.func(*_) >>  { args ->
        payload = args[0] // 1. capture arg for inspection
        SOME_RETURN_VAL // 2. return a canned response
    }
    and: "collaborator is passed correct args"
    with(payload) {
        //...do some verification over payload
    }
}

person pointyhat    schedule 21.12.2018    source источник


Ответы (1)


Давайте обратимся к документации Spock, хорошо?

Сочетание насмешек и заглушек

Насмешка и заглушка идут рука об руку:

1 * subscriber.receive("message1") >> "ok"
1 * subscriber.receive("message2") >> "fail"

При имитации и заглушке одного и того же вызова метода они должны происходить в одном и том же взаимодействии. В частности, следующее разделение в стиле Mockito stubbing и mocking на два отдельных оператора не будет работать:

given:
subscriber.receive("message1") >> "ok"

when:
publisher.send("message1")

then:
1 * subscriber.receive("message1")

Как объясняется в разделе Где объявлять взаимодействия, вызов receive сначала сопоставляется с взаимодействием в блоке then:. Поскольку это взаимодействие не определяет ответ, будет возвращено значение по умолчанию для типа возвращаемого значения метода (в данном случае null). (Это просто еще одна грань снисходительного подхода Спока к насмешкам.) Следовательно, взаимодействие в блоке given: никогда не сможет совпасть.

ПРИМЕЧАНИЕ

Насмешка и заглушка одного и того же вызова метода должны происходить в одном и том же взаимодействии.

person kriegaex    schedule 23.12.2018
comment
Это грустно. Когда вы впервые читаете о споке, они говорят вам, насколько они ценят читабельность, чистоту и т. д. Но затем вы находите это, что делает тест невозможным для понимания для того, кто не очень хорошо читает спока. - person AbdulRahman AlHamali; 21.09.2020