Spock Framework: как создать настраиваемый поставщик данных

Я работаю с:

  • Весенний МВК
  • Весенний MVC-тест
  • Спок Фреймворк

О работе Спока с @Unroll У меня следующая ситуация с блоком where

У меня может быть следующее:

where: "Internal"

    uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
    methodNameReport << [ControllerSupportTest.METHODNAME_FINDONE_BYID, ControllerSupportTest.METHODNAME_FINDONE_BYID ]

Здесь часть, которая раздражает в некотором роде, заключается в том, что данные должны совпадать в отношении количества элементов или структуры, в данном случае на 2.

Я имею в виду, следующее терпит неудачу:

where: "Internal"

    uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
    methodNameReport << [ControllerSupportTest.METHODNAME_FINDONE_BYID]

Как вы видите, теперь у methodNameReport есть один элемент.

Спок выдает исключение.

Поскольку я могу протестировать множество URL-адресов, это заставляет многословно повторять термин ControllerSupportTest.METHODNAME_FINDONE_BYID столько раз, сколько раз я использую ControllerSupportTest.createUrl#(), где # будет, например, 5.

В некотором роде я могу справиться следующим образом:

Примечание. Это класс Java.

public class MyDataSetUtil {

    private static final Integer COUNTER = 2;

    private MyDataSetUtil(){

    }

    public static List<String> uris(){
        String[] uris = new String[COUNTER];
        uris[0] = ControllerSupportTest.createUrl1()
        uris[1] = ControllerSupportTest.createUrl2()
    }

    public static String[] methodNames(){
        String[] methodNames = (String[])  
        createArray(ControllerSupportTest.METHODNAME_FINDONE_BYID);
        return methodNames;
    }

    private static String[] createArray(String value){
        String[] objects = new String[COUNTER];
        for(int i=0; i<COUNTER; i++){
            objects[i] = value;
        }
        return objects;
    }

}

До сих пор у меня есть два вида проблем

  1. Я должен всегда контролировать счетчик
  2. Если я добавлю новую переменную для блока where, такую ​​как mediaType, то я должен создать новый метод, такой как methodNames()
  3. Всегда я должен повторять одни и те же данные для каждого элемента в массиве, например ControllerSupportTest.METHODNAME_FINDONE_BYID

Для двух предыдущих пунктов это отражается следующим образом:

Например:

public static String[] mediaTypes(){
        String[] mediaTypes = (String[]) createArray(MediaType.APPLICATION_XML_VALUE);      
        return mediaTypes;
    }

Мне нужно что-то более практичное

Я тоже прочитал следующий пост от SO

Но в моей ситуации я не хочу использовать CSV пока.

Другой подход - через SQL, например:

Но опять же, в моей ситуации я не хочу использовать SQL пока.

Для меня более интересен такой подход:

В этом посте у него:

where:
  [_, name, gender, expected] << new MultilineProvider(source: userData)

Смотрите код MultilineProvider из поста.

поэтому я хочу сделать следующее:

[uriRequestReport, methodNameReport, moreVariablesifExists] << [MyDataSetUtil.theMethod()]

Требование:

Я хочу вернуть через MyDataSetUtil.theMethod() (см. строку, показанную выше) коллекцию, в которой каждый элемент представляет то же самое, что и

    uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
    methodNameReport << [ControllerSupportTest.METHODNAME_FINDONE_BYID, ControllerSupportTest.METHODNAME_FINDONE_BYID ]

Чтобы я мог легко добавить новую переменную в блок where и быстро обновить класс Java и избежать многократного повторения одних и тех же данных.

Что может быть лучшим подходом? Помните, что код должен быть основан на Java.

Я провел исследование в Google без решения.

Если у вас есть лучшее предложение, это приветствуется


person Manuel Jordan    schedule 17.02.2016    source источник
comment
Удивительно, но этот вопрос не помечен java.   -  person Rao    schedule 17.02.2016
comment
Моя ошибка... исправили...   -  person Manuel Jordan    schedule 17.02.2016


Ответы (2)


Просто напишите theMethod(), который будет возвращать набор записей, где каждая запись содержит все необходимые данные для одного запуска теста. ArrayList URL-адресов, ArrayList имен методов и ArrayList других данных. Затем поместите все списки в один большой ArrayList или карту и верните этот объект.

{
 "urls":[list of urls]
 "methods":[list of methodNames]
 "otherdata":[listOfOtherData]
}

вернуть карту напрямую или сделать массив таких карт.

person yeugeniuss    schedule 28.10.2016

Вы можете попробовать это:

where: "Internal"

uriRequestReport << [ControllerSupportTest.createUrl1(), ControllerSupportTest.createUrl2()]
methodNameReport = [ControllerSupportTest.METHODNAME_FINDONE_BYID]
person Ces    schedule 09.02.2019