В 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 свойство нулевого объекта.

Я могу обойти это двумя способами:

  1. Создайте статическое свойство в каждом подклассе, которое имеет то же значение, что и дискриминатор:

    class Pear extends Fruit {
        static String type = 'Pear'
        ...
    }
    

    Это кажется действительно смешным, и я объявляю одно и то же значение в двух местах.

  2. Изменить 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)
Другие вопросы по тегам