Заполнение объектов предметной области из табличных данных в groovy

Я довольно много использовал Spock, и мне очень нравится возможность использовать таблицы в тестах для сценариев ввода/вывода.

пример из документации Спока:

class Math extends Specification {
    def "maximum of two numbers"(int a, int b, int c) {
        expect:
        Math.max(a, b) == c

        where:
        a | b | c
        1 | 3 | 3
        7 | 4 | 4
        0 | 0 | 0
    }
}

Я работаю в финансовой сфере, где мы имеем дело с большим количеством торговых «книг».

Было бы здорово представить эти книги в табличной форме.

Поэтому вместо использования строителей, например:

builder.addQuote( 1000000, 1.1220, 1.2230)
       .addQuote( 2000000, 1.1219, 1.2233)
       .addQuote(10000000, 1.1217, 1.2234)
       .addQuote(15000000, 1.1216, 1.2240)

Было бы здорово использовать какую-то таблицу:

List<Quote> quotes = new ArrayList<Quote>();

MyUtil.insertInto(quotes).fromTable{
    quantity |    bid |    ask
     1000000 | 1.1220 | 1.2230
     2000000 | 1.1219 | 1.2233
    10000000 | 1.1217 | 1.2234
    15000000 | 1.1216 | 1.2240
}

Видели, как кто-то делал это здесь, но в примере результаты присваиваются общему объекту «Строка».

Было бы здорово иметь утилиту, которая записывает значения строк в заданный объект домена, используя имена полей из первой строки.


person Ben    schedule 26.03.2014    source источник
comment
Я не понимаю, в чем вопрос. Вы имеете в виду тот же синтаксис таблицы данных за пределами Спока? Это потребует от вас реализации подключаемого модуля компилятора Groovy, как это делает Spock.   -  person Peter Niederwieser    schedule 27.03.2014
comment
Нет, я имею в виду возможность построить граф объектов, используя табличные данные внутри спок-теста. Я обновлю приведенный выше код, чтобы попытаться сделать его более понятным. Таблицы настолько читабельны в Споке. Было бы здорово иметь возможность использовать тот же формат для заполнения списка объектов.   -  person Ben    schedule 27.03.2014
comment
Единственный способ добиться этого — разветвить Spock.   -  person Peter Niederwieser    schedule 27.03.2014
comment
Так этот формат таблицы в spock обрабатывается подключаемым модулем компилятора groovy?   -  person Ben    schedule 27.03.2014
comment
Да. Многие аспекты языка тестирования Spock обрабатываются (одним и тем же) подключаемым модулем компилятора Spock.   -  person Peter Niederwieser    schedule 27.03.2014


Ответы (2)


Вот как это сделать с помощью Groovy DSL: http://tux2323.blogspot.com/2013/04/simple-table-dsl-in-groovy.html

Используя пример по ссылке

List<Row> rows = TableParser.asListOfRows {
 quantity |    bid |    ask
  1000000 | 1.1220 | 1.2230
  2000000 | 1.1219 | 1.2233
 10000000 | 1.1217 | 1.2234
 15000000 | 1.1216 | 1.2240
}

Вы можете использовать собственную логику для преобразования Row в Quote

person MFIhsan    schedule 12.12.2014

Я написал API, который отвечает на мой собственный вопрос.

Он называется GroovyTables. Расположен по адресу: https://github.com/tools4j/groovy-tables.

Его можно использовать для заполнения типизированного списка объектов. например

List<Quote> quotes = GroovyTables.createListOf(Quote).fromTable {
    symbol    | price   | quantity
    "AUD/USD" | 1.0023  | 1200000
    "AUD/USD" | 1.0024  | 1400000
    "AUD/USD" | 1.0026  | 2000000
    "AUD/USD" | 1.0029  | 5000000
}
person Ben    schedule 07.04.2016