Нет хорошего способа проверить фактическую сортировку в модульных тестах, о которых я знаю. То, что вы пытаетесь протестировать, на самом деле является такой неотъемлемой частью интеграции GORM, что тестирование его на объектах доменных имен, даже если они поддерживают отображение сортировки, не проверяет фактический код, который будет выполняться.
Самым близким, что вы могли бы сделать в модульном тесте, было бы взглянуть на объект статического отображения, чтобы утверждать, что значение «sort» установлено на то, что вы ожидаете.
Я недавно написал в блоге 1006 * о том, как опрашивать классные замыкания для значений. Эту технику можно использовать, чтобы утверждать, что порядок сортировки установлен так, как вы ожидаете, вот так:
Объект домена Foo:
package com.example
class Foo {
String name
static mapping = {
sort "name"
}
}
Блок-тест FooTests:
package com.example
import grails.test.*
class FooTests extends GrailsUnitTestCase {
void testFooSort() {
def mappingValues = ClosureInterrogator.extractValuesFromClosure(Foo.mapping)
assertEquals "name", mappingValues.sort
}
}
Класс ClosureInterrogator, позволяющий увидеть, что делает замыкание:
package com.example
class ClosureInterrogator {
private Map closureValueMap = [:]
static Map extractValuesFromClosure(Closure closure) {
def interrogator = new ClosureInterrogator(closure)
return interrogator.closureValueMap
}
private ClosureInterrogator(Closure closure) {
def oldResolveStrategy = closure.getResolveStrategy()
def oldDelegate = closure.getDelegate()
closure.delegate = this
closure.resolveStrategy = Closure.DELEGATE_FIRST
try {
closure()
} finally {
closure.setDelegate(oldDelegate)
closure.setResolveStrategy(oldResolveStrategy)
}
}
// property getter
def propertyMissing(String name) {
return closureValueMap[name]
}
// property setter
def propertyMissing(String name, value) {
closureValueMap[name] = value
}
def methodMissing(String name, args) {
if (args.size() == 1) {
closureValueMap[name] = args[0]
} else {
closureValueMap[name] = args
}
}
}