Я работаю над обновлением довольно большого приложения Grails 2.5 до Grails 4.0.3. У меня есть что-то похожее в моей доменной структуре на мой пример здесь.
package com.test
class Face {
static hasOne = [mouth: Mouth]
static constraints = {
}
}
package com.test
abstract class Mouth {
Face face
static constraints = {
}
}
package com.test
class BigMouth extends Mouth {
Integer numberOfTeeth
Boolean tonsilsRemoved
}
Поведение, которое я ожидаю увидеть при проверке объекта лица, состоит в том, что он также должен проверять объект рот. Итак, у меня есть тестовый Контроллер, настроенный для тестирования этого типа
package com.test
class TestController {
def index() {
Face face = new Face()
face.mouth = new BigMouth(
face: face
)
// numberOfTeeth & tonsilsRemoved cannot be null, but are
assert !face.validate()
println 'no failure'
}
}
И тестового примера
package com.test
import grails.testing.gorm.DomainUnitTest
import spock.lang.Specification
class FaceSpec extends Specification implements DomainUnitTest<Face> {
def setup() {
}
def cleanup() {
}
void "test hasOneValidation"() {
when:
domain.mouth = new BigMouth(numberOfTeeth: null)
then:
!domain.validate()
}
}
Однако поведение, которое я вижу, заключается в том, что лицо действительно и оно не передает утверждение assert. У нас это сработало в 2.5. Еще одно замечание относительно этого тестового примера: если я переместу свойства BigMouth в Mouth и сделаю его конкретным классом, тот же тест будет иметь объект-лицо, которое не проходит проверку и передает оператор assert.
Это ожидаемое поведение для Grails 4.0.3 или нет? Если нет, то я что-то здесь явно не так делаю?
Запуск Grails 4.0.3, Java 11, Windows 10