cmd
не null
;однако assertTrue
выдает AssertionFailedError
с сообщением null
.Либо укажите сообщение по умолчанию (assertTrue "default message", cmd.hasErrors()
), либо просто укажите assert cmd.hasErrors()
.
Итак, давайте посмотрим, почему cmd.hasErrors()
возвращает false
.- Это потому, что пользовательский валидатор не возвращает false
, а вместо этого некоторую строку, которая оценивается как true
в соответствии с «Groovy Truth».(Там, похоже, API Grails изменился после публикации книги.)
В классе LoginCommand
измените
login blank:false, validator:{ val, cmd ->
if(!cmd.user)
return "user.not.found"
}
на
login blank:false, validator:{ val, cmd ->
if(!cmd.user)
return false
}
Тогда код ошибки будет «LoginCommand.login.validator».
Если вам нужен собственный код ошибки, вы можете добавить объект ошибки самостоятельно (без возврата чего-либо), например так:1028 *
login blank:false, validator:{ val, cmd ->
if(!cmd.user)
cmd.errors.rejectValue('login', 'user.not.found')
}
PS: Вы не должны использовать класс MockUtils
напрямую, а вместо этого extend GrailsUnitTest
.Кроме того, MockUtils.prepareForConstraintsTests(Class)
устарела;кроме того, он не подходит для командных объектов.- Вместо этого используйте метод mockForConstraintsTests(Class)
, унаследованный от GrailsUnitTest
.