Довольно базовая проблема, но ее корни уходят глубоко в рамки (и по этому вопросу мало определенной информации), поэтому я выкладываю ее здесь, чтобы избавить других от боли (и чтобы убедиться, что я прав или нетв моем представлении).
В чем проблема?
Grails автоматически вводит поле id типа Long в ваши домены ( см. комментарий Беквита ).При использовании устаревшей БД Grails по умолчанию сопоставляет Longs с bigints, неэффективный тип хранилища будет избегать любой, кто имеет дело с таблицами с миллионами записей.
Обнаружив это несколько месяцев назад, я принялся за работу над созданием «правильного» типа столбца для идентификаторов моего домена.Не имея фона Java, я слепо подумал: длинный-плохой, хороший-целочисленный и установить диалект отображения гибернации для целочисленных типов на то, что я делал бы вручную в mysql
registerColumnType (Types.INTEGER, 'mediumint unsigned ')
и затем определили "Integer id" во всех моих доменах (необязательно в соответствии с комментарием Берта в ссылке выше).Все работало плавно, замечательно, по другим вопросам.
Перенесемся в Grails 2.0 (так как я не смог устоять перед всеми вкусностями ;-)) и Споком.На протяжении всей жизни я не мог понять, почему, несмотря на новый 2.0 GORM в памяти и поддержку динамических искателей, Domain.findByFoo (fooVal) всегда будет возвращать ноль (да, я @Mock (Domain) и заполняться тестовыми данными).Фактически, как в самом тесте, так и в цели @TestFor, единственными работающими методами GORM были save () и get ();все остальное вернулось null.
Я запустил быстрое тестовое приложение, спецификация domain + controller + spoc и обнаружил источник проблемы: если вы используете для идентификаторов тип свойства, отличный от Long (включая ссылочные FK), ваш домен @Mock станет бесполезным.
Итак, я прав или нет, говоря, что для использования всех преимуществ фреймворка необходимо использовать длинные идентификаторы?@Mock + @TestFor + Спок - невероятное комбо!Руководство ценится прежде, чем я отправлюсь по дороге от рефактора к Длинной дороге ...