31

メソッドがどのように応答するかをモックするには、使用する必要があることを知っています

every { instanceX.methodB() } returns "42"

hasNext() と next() の 2 つのメソッドをモックする必要があるイテレータをモックしようとしています。hasNext() が true を返す場合は常に無限ループが発生し、最初から false を返す場合は next()何も返しません。

私の質問は、mockito でできるように、mockk で個々の呼び出しを 1 つずつモックする方法はありますか? ドキュメントには何も見つかりませんでした。

4

3 に答える 3

47

優れた投稿Mocking is not Rocket Scienceには、2 つの代替案が記載されています。

returnsMany1 つずつ使用される値の数を指定します。つまり、最初に一致した呼び出しは最初の要素を返し、2 番目は 2 番目の要素を返します。

    every { mock1.call(5) } returnsMany listOf(1, 2, 3)

andThen コンストラクトを使用して同じことを実現できます。

    every { mock1.call(5) } returns 1 andThen 2 andThen 3
于 2019-04-27T07:39:34.187 に答える
3

今、私は同様のユースケースを持っていますが、私answersには適切な解決策がありIteratorますIterator.

every { mock.bogusIterator() /* : CustomIterator */ } answers { 
  val testIterator = testList.iterator() // just an Iterator
  every { hasNext() } answers { testIterator.hasNext() }
  every { next() } answers { testIterator.next() }
}

wheretestListには、テスト用の事前定義された値が含まれています。

returnsその時点で関数に与えられた値を常に返します。そのため、可変かどうかに関係なく、 usingevery { hasNext() } returns whateverは常にwhateverそのモック宣言時にの値を返します。whatever一方、 with ではanswer、関数の呼び出し時に返すものの現在の値を常に取得します。誰かがそれで混乱した場合に備えて;-)私のさらなる説明も少し混乱するかもしれません:-)

于 2019-09-19T10:23:30.713 に答える