2016-12-20 3 views
1

При тестировании обновления объекта я также хочу убедиться, что даты работают правильно. В моей сущности у меня есть:Thread.sleep Плохая идея для весенних тестов интеграции?

@PreUpdate 
private void onUpdate() { 
    this.lastUpdated = new LocalDateTime(); 
} 

Когда я проверить бренд получать обновления, я создал бренд, изменяя его, затем вызвать обновление, после которой я refetch бренд утверждать, я мог бы найти его на измененное значение.

Время между сохранением и обновлением часто настолько мал, даты в конечном итоге то же самое:

assertThat(first.getLastUpdated().isBefore(brand.get().getLastUpdated())).isEqualTo(true);

Я решил эту проблему в настоящее время путем добавления в Thread.sleep(100) вызова между сохранять и обновлять, но моя кишка говорит, что это действительно плохая идея. Мысли?

+1

Я бы посмотрел на это и перестроил свой код, как предлагает принятый ответ. http://stackoverflow.com/questions/11887799/how-to-mock-new-date-in-java-using-mockito Во-вторых, вы должны иметь возможность предположить, что '@ PreUpdate' работает по назначению, и если вы хотите, чтобы ваш метод был аннотирован, выполните небольшой единичный тест, чтобы проверить это. Вы также можете позволить базе данных обрабатывать _on update_ (я бы предпочел это сам), если он поддерживает его –

ответ

0

В целом, я думаю, да, его плохая идея. Тесты (включая интеграционные тесты, конечно) должны быть как можно быстрее. Если у вас есть базовый код спуска и количество тестов интеграции, многие такие спящие могут стоить минуты или даже часы. Если вы используете Continuous Integration, это может быть серьезной проблемой, потому что вам нужна быстрая сборка.

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

Хорошая новость, что обычно большинство таких кодов, вероятно, будут покрываться модульными тестами вообще, поэтому вам не понадобится сложная настройка. Вероятно, у вас будет гораздо меньше интеграционных тестов, может быть, один или два для компонента.

Надеюсь, это поможет

+0

Спасибо, это полезно вместе с комментариями Мартина. – Gregg

0

Если вы используете Java 8, было бы проще вводить соавтор Clock, который вы могли бы контролировать для своих тестов.

Смежные вопросы