В Grails, как мне издеваться над GrailsDomainBinder в модульном тесте?
У меня есть куча подклассов, например, так:
abstract class Fruit {
...
String getType() {
// get the discriminator value for this type
GrailsDomainBinder.getMapping(this.class).discriminator
}
}
class Apple extends Fruit {
static mapping = {
discriminator 'Apple'
}
}
class Pear extends Fruit {
static mapping = {
discriminator 'Pear'
}
}
Другими словами, Fruit
является базовым типом с Apple
а также Pear
как подтипы. Я выставил type
свойство, которое получает значение дискриминатора, установленное в подклассах.
Теперь у меня есть JsonExportService
который экспортирует экземпляр в виде данных JSON. Когда я запускаю приложение, этот сервис правильно экспортирует type
свойство, заполненное значением дискриминатора.
Теперь мне нужно написать модульный тест для JsonExportService
, Проблема в том, GrailsDomainBinder
не похоже на макет в юнит-тестах, и я получаю NPE: не могу получить доступ discriminator
свойство нулевого объекта.
Я могу обойти это двумя способами:
Создайте статическое свойство в каждом подклассе, которое имеет то же значение, что и дискриминатор:
class Pear extends Fruit { static String type = 'Pear' ... }
Это кажется действительно смешным, и я объявляю одно и то же значение в двух местах.
Изменить
getType()
код для:GrailsDomainBinder.getMapping(this.class)?.discriminator
Это работает, но теперь я в основном игнорирую дискриминатор, и модульный тест не является "полным", потому что он требует дополнительного интеграционного теста, чтобы убедиться, что
getType()
Метод возвращает правильное значение.
Кто-нибудь знает лучший, удобный для юнит-тестирования способ получения значения дискриминатора из сопоставления доменов?
1 ответ
Кажется, что DefaultGrailsDomainConfiguration
отвечает за инициализацию сопоставлений, поэтому вы можете попробовать:
def domainClass = grailsApplication.getDomainClass(Pear.class.name)
DefaultGrailsDomainConfiguration.configureDomainBinder(grailsApplication, [domainClass] as Set)
println GrailsDomainBinder.getMapping(Pear)