Tl; др : я хочу пройти тест MyCmdTest."data bind works"
в этот код зеленый.
Спасибо Джеффу Скотту Брауну за получение меня так далеко .
У меня есть POGO с некоторыми пользовательскими преобразованиями из JSON, которые я ожидаю получить в контроллере Grails:
def myAction(MyCmd myData) {
...
}
С:
@Validateable
class MyCmd {
SomeType some
void setSome(Object value) {
this.some = customMap(value)
}
}
Обратите внимание, как customMap
создает экземпляр SomeType
из значения JSON (скажем, String).Давайте предположим, что установщик по умолчанию не будет работать;например, шаблон, который у нас есть более одного раза, является перечислением следующим образом:
enum SomeType {
Foo(17, "foos"),
Bar(19, "barista")
int id
String jsonName
SomeType(id, jsonName) {
this.id = id
this.jsonName = jsonName
}
}
Здесь customMap
будет принимать целое число или строку и возвращать соответствующий регистр (или null
, еслине подходит).
Теперь у меня есть модульный тест следующей формы:
class RegistrationCmdTest extends Specification {
String validData // hard-coded, conforms to JSON schema
void test() {
MyCmd cmd = new MyCmd(JSON.parse(validData))
// check members: success
MyCmd cmd2 = JSON.parse(validData) as MyCmd
// check members: success
}
}
Видимо, setSome
вызывается в обоих вариантах.
Я такжеиметь тестовый модуль контроллера, который устанавливает для JSON запроса ту же строку:
void "register successfully"() {
given:
ResonseCmd = someMock()
when:
controller.request.method = 'POST'
controller.request.contentType = "application/json"
controller.request.json = validData
controller.myAction()
then:
noExceptionThrown()
// successful validations: service called, etc.
}
По сути, то же самое выполняется и в качестве интеграционного теста.
Однако отображение не удается при запуске полного приложения;some == null
.
Какие методы мне нужно реализовать или переопределить, чтобы Grails вызывал мои преобразования (здесь customMap
) вместо вставки null
, где он не знает, что делать?