DbUnit: проблема с генерацией идентификатора приращения - PullRequest
2 голосов
/ 09 февраля 2010

Я использую DbUnit вместе с Unitils, который прекрасно работает большую часть времени.

Сегодня я обнаружил странную проблему.

Ситуация:

  • Я использую Hibernate, и у меня есть идентификатор с генератором "increment":
<id name="Id">
   <generator class="increment"/>
</id>
  • Я готовлю тестовый набор данных, где максимальный идентификатор равен 5.
  • Я использую стратегию загрузки с чистой вставкой.
  • У меня есть два метода тестирования test1 и test2, каждый из которых добавляет одну строку в эту таблицу.
  • После метода test1 вновь добавленная строка имеет идентификатор = 6.
  • После метода test2 вновь созданная строка имеет id = 7.

Это все хорошо, и я понимаю, почему это так. Это проблема с точки зрения обслуживания, хотя. Если я когда-нибудь добавлю третий метод тестирования между ними, метод test2 внезапно завершится неудачей, даже если ничего не изменилось, просто потому, что строка получит другой идентификатор.

Можно ли в любом случае заставить DbUnit или Hibernate вычислять следующее значение id перед каждым методом тестирования?

Ответы [ 2 ]

3 голосов
/ 09 февраля 2010

Во-первых, вы должны предоставить полный набор данных, да, с id. Если нет, не проверяйте или не основывайте свой тест на ids. Почему бы не проверить? потому что это уже хорошо проверенная и надежная вещь. Всегда помните, никогда не тестируйте сторонние библиотеки, большинство из них уже хорошо протестированы. Но, кажется, совершенно невозможно не зависеть от id с. Я согласен, вы должны написать какой-нибудь фиктивный класс, чтобы решить эту проблему для вас, или, может быть, вы можете предоставить какой-то метод установки для перезаписи значения, созданного вашим собственным.

Второй вариант - всегда начинать тестовый набор с пустой таблицы. Вы можете написать приспособление для очистки таблицы перед каждым тестом.

3 голосов
/ 09 февраля 2010

Решение не полагаться на сгенерированные идентификаторы:

  • они находятся вне контроля вашего теста.
  • если вы контролируете их тестом, вы больше не тестируете тестируемый класс
...