Проблема действительно в проблеме курицы и яйца, о которой я упоминал в своем комментарии к jaco0646 ответу. Позвольте мне воссоздать основную проблему в MCVE :
package de.scrum_master.stackoverflow.q60143388;
public class RequestMessage {}
package de.scrum_master.stackoverflow.q60143388;
public class MessageService {
MessageBuilder messageBuilder;
public RequestMessage getMessage(String id) {
return messageBuilder.buildNew(id);
}
}
package de.scrum_master.stackoverflow.q60143388
import spock.lang.Specification
class MessageServiceTest extends Specification {
def "build request message"() {
given:
def id = "12345"
MessageBuilder messageBuilder = Mock()
MessageService messageService = new MessageService()
messageService.messageBuilder = messageBuilder
when:
RequestMessage requestMessage = messageService.getMessage(id)
then:
1 * messageBuilder.buildNew(id) >> requestMessage
}
}
Это даст:
groovy.lang.MissingPropertyException: No such property: requestMessage for class: de.scrum_master.stackoverflow.q60143388.MessageServiceTest
at de.scrum_master.stackoverflow.q60143388.MessageServiceTest.build request message(MessageServiceTest.groovy:17)
Просто объявив requestMessage
в блок given:
, как предложено jaco0646 , и затем использование его в качестве результата-заглушки не сделает это в одиночку. Вы должны убедиться, что сначала объявляете объект (например, макет), который должен быть возвращен методом построителя, но присваиваете результат тестируемого вызова метода другой переменной, чтобы вы могли сравнить их или сделать любую проверку, какую захотите выполните:
package de.scrum_master.stackoverflow.q60143388
import spock.lang.Specification
class MessageServiceTest extends Specification {
def "build request message"() {
given:
def id = "12345"
RequestMessage requestMessage = Mock()
MessageBuilder messageBuilder = Mock()
MessageService messageService = new MessageService()
messageService.messageBuilder = messageBuilder
when:
RequestMessage result = messageService.getMessage(id)
then:
1 * messageBuilder.buildNew(id) >> requestMessage
result.toString().startsWith("Mock for type 'RequestMessage'")
}
}
Теперь тест пройден, и ваша проблема с загрузкой решена. Вы не можете создать объект с помощью вызова метода, а затем одновременно указать его как ожидаемый результат заглушки. Это не имеет никакого логического смысла.