1
  • JUnit テストでMockitoを使用しています。私はあざけりました。NavigableSet
  • ある時点での単体テストでは、 this に含まれるオブジェクトにループする必要がありますNavigableSet
  • NavigableSetこれには、テスト目的で、オブジェクトを 1 つだけ含めるように計画しました。

以下は、モック オブジェクトを作成するために Mockito で使用したコードです。

NavigableSet<ObjectToProcess> newMockedSet = new TreeSet<ObjectToProcess>();
ObjectToProcess mockedInnerObject = new ObjectToProcess(); // initialization of this object
newMockedSet.add(mockedInnerObject); // I just added the only 1 object contained in the NavigableSet
Mockito.when(getSetOfObjectToProcess()).thenReturn(newMockedSet);

次のループが1 つのオブジェクトのみを含むwhile無限ループになるのはなぜですか?NavigableSet

NavigableSet<ObjectToProcess> anotherSetOfObjects = getSetOfObjectToProcess(); // retrieving the mocked object
while (anotherSetOfObjects.iterator().hasNext())
{
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next();
    // do stuff
}

for次のループが 1 回だけループして期待どおりに動作するのはなぜですか?

NavigableSet<ObjectToProcess> anotherSetOfObjects = getSetOfObjectToProcess(); // retrieving the mocked object
for (ObjectToProcess thisMockedInnerObject : anotherSetOfObjects)
{
    ObjectToProcess thisPaymentDemand = thisMockedInnerObject;
    // do stuff
}
4

2 に答える 2

3

これは Mockito の問題ではありません。

whileの例では、繰り返しごとanotherSetOfObjects.iterator()にループの開始時に呼び出しています。

イテレータ(単一のアイテムを含む mockedSet の場合)を取得し、次があるかどうかを確認して(そうです)、ループの本体に入ります。本体が完了したら、条件付きチェックを再度実行して、ループするかどうかを確認します...最初のイテレータとまったく同じように機能するNEWイテレータを取得します (その間にセットを変更していないと仮定します)。 .

イテレータをループの外に格納して、新しいイテレータを取得するのではなく、各イテレーションで同じイテレータをテストするようにします。

Iterator<NavigableSet> iterator = anotherSetOfObjects.iterator();
while (iterator.hasNext())
{
    ObjectToProcess thisPaymentDemand = anotherSetOfObjects.iterator().next();
    // do stuff
}

これを行うと、while ループが for ループと同じように動作します。

于 2013-02-13T19:12:26.707 に答える
1

投稿されたコードから意図を理解するのは難しいです。いくつかの共同クラス タイプのモック オブジェクトの作成と、テストしているクラスの ID を示す必要があります。また、when()呼び出しの引数は、Mockito モックのメソッド呼び出しの形式であると想定されています。言い換えると、

// setting up test fixture
MyCollaborator x = Mockito.mock(MyCollaborator.class);
when(x.getSetOfObjectToProcess()).thenReturn(newMockedSet);

// and then later in test
NavigableSet<ObjectToProcess> anotherSetOfObjects = x.getSetOfObjectToProcess();
while(anotherSetOfObjects.iterator() ...) {

// or
for (ObjectToProcess thisMockedInnerObject : anotherSetOfObjects) {
... 

したがって、引数のx.一部が欠落しています。when()

あまり明確でないのは、そもそもあなたの意図が何であるかです。あるクラスでメソッドをテストしようとしている場合getSetOfObjectToProcess()、そのクラスをモックするべきではありません。テストしているクラス (「テスト対象のシステム」または SUT と呼ばれることが多い) と対話するコラボレーター クラス/オブジェクトのみをモックする必要があります。

Mockito.mock()あなたのコードは、メソッドまたは注釈を使用して Mockito モック オブジェクトを作成することさえ示していません。Mockito@Mockを使用するには、それらの少なくとも 1 つが必要です。が静的メソッドの場合getSetOfObjectToProcess()、Mockito はそれをモックしません。

于 2013-02-13T19:14:28.753 に答える