2012-05-28 3 views
1

Я писал код, который обрабатывает определенные поля объекта, изменяя их значения. Чтобы проверить его, я сначала написал тестовый пример JUnit, который рекурсивно пересекает поля объекта и гарантирует их правильное изменение. CUT (Class Under Test) делает что-то похожее: он рекурсивно пересекает поля объекта и изменяет их по мере необходимости.Java: дублирование кода в классах и их тестовые примеры Junit

Таким образом, код для рекурсивного прохождения полей остается неизменным в тестовом случае и CUT и в настоящее время дублируется, что противоречит DRY. Поэтому у меня есть два вопроса:

1) Вы сталкивались с такими ситуациями в своем проекте? Если да, применяете ли вы DRY, или пусть такое дублирование остается таким, как есть?

2) если я поместил этот общий код в метод утилиты, мне нужно будет написать тестовый пример, чтобы проверить это, что снова будет включать рекурсивные пересечения полей. Итак, как это можно решить без добавления дублирования?

ответ

4

Вы только что нанесли удар по ugly mirror testing anti-pattern. Если ваш CUT имеет ошибку, скорее всего, вы скопируете его в тестовый пример, по существу проверяя, что ошибка все еще существует.

Вы должны показать нам еще какой-нибудь код, но в основном ваш тестовый пример должен быть намного проще, нет for циклов, никаких условий - просто утверждений. Если ваш производственный код делает некоторые причудливые перемещения, отражение и т. Д. В сложных структурах данных - создайте тестовый объект Java и проверите каждое поле вручную в модульном тесте.

+0

Я показал аналогичный код здесь: http://stackoverflow.com/questions/10749946/java-using-command-pattern-in-the-following-code Объекты, которые я обрабатываю, являются большими, поэтому нерекурсивный JUnit для их проверки станет довольно длинным. Возможно, это единственный способ проверить это. И вы правы в том, что у вас такая же ошибка в тестах и ​​CUT. Я сжег пальцы в этом же коде. – shrini1000

+0

@ shrini1000: глядя на ваш код: ** да **, создайте образец объекта и сделайте все утверждения вручную. Это ** является правильным способом. –

1

Используйте шаблон посетителя для абстрактного перемещения по дереву, а затем создайте посетителей как в тестовом примере, так и в вашем продуктивном коде. И протестируйте инфраструктуру Visitor отдельно.

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