2012-03-17 4 views
3

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

Есть ли встроенный метод или это просто путем сравнения каждого элемента в нем?

Спасибо, Sriram

+0

Не думаю, что я когда-либо рассматривал этот вопрос. –

+1

Помните, что «Итератор» может быть сколь угодно длинным (даже бесконечным). Если бы был встроенный метод проверки равенства двух итераторов, и он работал в течение разумного промежутка времени, я мог бы использовать его для создания интересных и опубликованных математических доказательств. – emory

+0

Кроме того, тестирование содержимого является деструктивным действием. – OrangeDog

ответ

1

Нет никакого разумного способа проверить равенство Iterators.

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

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

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

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

+0

> «..., поскольку вы могли бы выполнять итерацию над клоном вашей коллекции, то есть итераторы выглядят одинаково, но нет.» < Что вы имели в виду под «клоном»?Я вижу, что разработчик может иметь «базовую коллекцию» при работе с итераторами, но итераторы могут существовать без '' Collection''' и '' Iterable'''. В тестовом сценарии может иметь смысл проверить поведение итератора, потому что иногда у вас просто нет выбора, кроме как иметь дело с данным API, независимо от того, насколько он хорош. –

+0

У вас может быть точная копия вашей оригинальной коллекции и два итератора, указывающих на каждый из них в том же положении. Если вы просто сравниваете значения контейнера с помощью этих итераторов, вы думаете, что итераторы равны *, но на самом деле они указывают на различные коллекции. – Irfy

+0

Итак, ваша идея заключалась в том, что при сравнении итераторов вы хотите, чтобы они были равны, если их базовые коллекции идентичны, что, конечно же, подразумевает, что такие базовые коллекции существуют в первую очередь. Я не думаю, что это необходимо, потому что, даже если официальный Javadoc определяет «Итератор» как «итератор над коллекцией» (с нижним регистром «c»), интерфейс '' Iterator'' нет средств доступа к коллекции, но только один элемент за другим. Поэтому, учитывая только «Итератор», мы не можем даже говорить о базовой коллекции при определении равенства. –

5

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

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

+1

Возможно, не обязательно должна быть базовая коллекция. Если существует базовая коллекция, она может быть бесконечной. – emory

+1

У меня есть функция, которая возвращает тип Iterator. http://stackoverflow.com/questions/9747291/does-a-getter-with-a-different-return-type-qualify-as-a-getter. Я пытаюсь проверить это. – sriram

+1

@emory, хорошая точка, хотя они больше напоминают случаи для функционального языка, а не для Java. –

0

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

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

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