2012-03-17 3 views
3

JUnitを使用して2つのイテレータの等価性をテストするにはどうすればよいですか?2つのイテレータのテスト平等?

メソッドが組み込まれていますか、それともその中のすべての要素を比較するだけですか?

おかげで、 スリラム

+0

私はこの質問を考えたことはありません。 –

+1

「反復子」は任意に長く(無限でも)可能であることに注意してください。 2つのイテレータの等価性をテストするためのメソッドが組み込まれていて、それが妥当な時間内に機能した場合は、それを使って興味深く公開可能な数学的証明を生成できます。 – emory

+0

また、コンテンツのテストは破壊的な操作です。 – OrangeDog

答えて

1

Iteratorsの等価性をテストする正気な方法はありません。

これはオプションですが、テストする特定のイテレータタイプの実装を掘り下げ、リフレクションを使用してプライベートなものにアクセスして比較することができます(十分な例えば、2つのListIteratorが等しくなるために必要なものを見つけることができます。

あなた自身のイテレータタイプの場合は、あなたを助けるいくつかの変数をエクスポートし、リフレクションの代わりに使用してください。

要素の反復処理と比較は、コレクションのクローンを反復処理する可能性があるため、イテレータは同じであるが、そうではないことを意味します。

これを行わないでください。

+0

> "...コレクションのクローンを反復処理する可能性があるため、イテレータは同じであるが、そうではないことを意味します。" < "クローン"はどういう意味ですか?イテレータを扱うときに開発者が「基になるコレクション」を念頭に置いているかもしれないという問題があるのですが、イテレータは '' Collection''と '' Iterable''なしで存在する可能性があります。テストシナリオでは、イテレータの動作をチェックするのが理にかなっているかもしれません。設計されていても、指定されたAPIを処理する以外に選択肢がないことがあります。 –

+0

元のコレクションの正確なコピーと、同じ位置にある各イテレータを指す2つのイテレータを持つことができます。これらのイテレータを使ってコンテナの値を比較するだけであれば、イテレータは* equal *と思うでしょうが、実際には異なるコレクションを指しています。 – Irfy

+0

あなたが考えているのは、イテレータを比較するとき、それらの基になるコレクションが同一である場合にのみイテレータを等価にしたいということです。もちろん、そのような基になるコレクションが最初に存在することを意味します。 正式なJavadocが「イテレータ」を「コレクションのイテレータ」(小文字の「c」)として定義していても、「Iterator」インタフェースは、コレクションにアクセスする手段はありませんが、後に続く要素は1つだけです。だから、 '' Iterator''だけを考えると、等価を定義する際に、基礎となるコレクションについて実際には話すことはできません。 –

5

あなたは(とする必要はない)、基礎となるコレクションの唯一のものをイテレータの平等をテストすることはできません。これを行うには、両方を繰り返して、順番に各要素のペアを比較することができます。これは、イテレータの少なくとも1つを効果的に消費することに注意してください。結果はテスト開始時のイテレーターの状態に依存するため、このメソッドは脆弱です。したがって、できる限り、基になるコレクションを取得し、それらが同等であることを直接テストしてください(equalsメソッドを使用すること)。

なぜ2つのイテレータの等価性をテストしたいのですか?具体的な問題を説明すると、より良い選択肢を提供できる可能性があります。

+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のImmutableList.copyOf(Iterator<T>)を使用して、次にthis SO answerに記載されているようにassertThat(a, is(b))に進みます。

関連する問題