Groovy Spread Operator с опцией Spock Framework Mock внутри "_" - PullRequest
0 голосов
/ 27 января 2019

Я новичок в groovy и Spock.

Я пытаюсь создать универсальный метод для насмешки объектов в моей системе.

проблема

Я пытаюсь создать функцию, которая получит объект и динамически смоделирует функции, которые я хочу в объекте.функция получает карту функций с данными, когда имитировать каждый из них и что возвращать.функции возвращают ошибку.

Я создал класс

    class MetaData {
    Object[] argTypes
    def returnValue
    Object[] argsMatchers

    MetaData(Object[] argTypes, returnValue, Object[] argsMatchers) {
        this.argTypes = argTypes
        this.returnValue = returnValue
        this.argsMatchers = argsMatchers
    }
}

Функция пересмешки:

    def mockFunctionTestData(Map overrides = [:], def clazz){
    def args = Mock(clazz)
    overrides.each { String key, value ->
        Object[] argTypes = value.argTypes
        if(args.metaClass.respondsTo(args, key, argTypes).size() == 1){
            def methodToGetRequest = key
            def argsMatchers = value.argsMatchers
            def returnValue = value.returnValue

            args."$methodToGetRequest"(*argsMatchers) >> returnValue
        } else {
            println "Error: Trying to add property that doesn't exist"
        }
    }
    return args
}

Я создаю объект:

def functionData = new MetaData([Date, Date, List, boolean] as Object[],
      meas,
      [_ as Date, _ as Date, new ArrayList<>(), true] as Object[]) //the line that fails
def dogDAO = [getDogData: functionData]


def testDog= mockFunctionTestData(dogDAO , Dog)

приведенный выше код возвращает следующее исключение:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '_' with class 'org.spockframework.lang.Wildcard' to class 'java.util.Date' due to: groovy.lang.GroovyRuntimeException: Could not find matching constructor for: java.util.Date(org.spockframework.lang.SpreadWildcard)

строка, которая не работает

[_ as Date, _ as Date, new ArrayList<>(), true] as Object[]) 

1 Ответ

0 голосов
/ 27 января 2019

В Spock Framework вы не можете создавать насмешки таким динамичным образом.Спок имеет свой собственный компилятор (точнее, AST Transformation), который создает исполняемый тестовый код.Только в разделе взаимодействия он распознает «_» как символ подстановки и оператор «>>» для возврата фиксированного значения.Вот почему вы получаете это исключение.Потому что подстановочный знак «_» отсутствует в разделе взаимодействия.Я бы предложил написать свой тест, подобный следующему:

class DogSpec extends Specification {
    def "test the dog"() {
        when:
        def dog = Mock(Dog) {
            1 * getDogData(_ as Date, _ as Date, new ArrayList<>(), true) >> "Bark"
        }

        then:
        dog.getDogData(new Date(), new Date(), [], true) == "Bark"
    }
}
...