проверить равенство двух итераторов? - PullRequest
3 голосов
/ 17 марта 2012

Как мне проверить на равенство двух итераторов с помощью JUnit?

Существует ли какой-либо встроенный метод или он просто сравнивает каждый элемент в этом?

Спасибо, Шрирам

Ответы [ 3 ]

5 голосов
/ 17 марта 2012

Вы не можете (и не должны) проверять равенство итераторов, только равенство базовых коллекций.Чтобы сделать это, вы можете перебрать и то и другое и сравнить каждую пару элементов по очереди, как вы уже догадались.Обратите внимание, что это эффективно использует по крайней мере один из итераторов.И результат зависит от состояния итераторов в начале теста, поэтому этот метод является хрупким.Таким образом, лучше всего получить доступ к базовым коллекциям и проверить их напрямую на равенство (используя их метод equals), когда вы можете.

Зачем вам проверять равенство двух итераторов?Если вы объясните свою конкретную проблему, мы сможем предложить лучшую альтернативу.

1 голос
/ 17 марта 2012

Не существует нормального способа проверить равенство Iterator s .

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

Или, если это ваш собственный тип итератора, экспортируйте некоторые переменные, которые помогут вам, и используйте их вместо отражения.

Итерирование и сравнение элементов - лишь слабая гарантия, так как вы могли бы итерировать поклон вашей коллекции, то есть итераторы выглядят одинаково, но не так.

Только не делайте этого.

0 голосов
/ 16 ноября 2016

Не существует "классического" понятия равенства для Iterator с, за исключением идентичности объекта, потому что они изменчивы в "худшем" виде.

В сценарии JUnit, вероятно, было бы предпочтительным собрать значения next(), возвращаемые в список, например, используя Guava ImmutableList.copyOf(Iterator<T>), а затем перейдите к assertThat(a, is(b)), как описано в этом SO-ответе

...