117

Spock テストでの Mock、Stub、Spy の違いがわかりません。また、オンラインで見たチュートリアルでも、それらについて詳しく説明されていません。

4

4 に答える 4

63

質問はSpockフレームワークのコンテキストにあり、現在の回答がこれを考慮しているとは思いません.

Spock docsに基づいています(カスタマイズされた例、私自身の文言が追加されています):

スタブ: 共同作業者が特定の方法でメソッド呼び出しに応答するようにするために使用されます。メソッドをスタブ化する場合、メソッドが呼び出されるかどうか、またその回数が呼び出されるかどうかは気にしません。呼び出されるたびに、何らかの値を返すか、何らかの副作用を実行するだけです。

subscriber.receive(_) >> "ok" // subscriber is a Stub()

モック: 仕様下のオブジェクトとその共同作業者の間の相互作用を説明するために使用されます。

def "should send message to subscriber"() {
    when:
        publisher.send("hello")

    then:
        1 * subscriber.receive("hello") // subscriber is a Mock()
}

モックは、モックおよびスタブとして機能できます。

1 * subscriber.receive("message1") >> "ok" // subscriber is a Mock()

スパイ: 常に、実際のことを行う独自のメソッドを備えた実際のオブジェクトに基づいています。Stub のように使用して、select メソッドの戻り値を変更できます。インタラクションを説明するためにモックのように使用できます。

def subscriber = Spy(SubscriberImpl, constructorArgs: ["Fred"])

def "should send message to subscriber"() {
    when:
        publisher.send("hello")

    then:
        1 * subscriber.receive("message1") >> "ok" // subscriber is a Spy(), used as a Mock an Stub
}

def "should send message to subscriber (actually handle 'receive')"() {
    when:
        publisher.send("hello")

    then:
        1 * subscriber.receive("message1") // subscriber is a Spy(), used as a Mock, uses real 'receive' function
}

概要:

  • Stub() はスタブです。
  • Mock() はスタブとモックです。
  • Spy() は、スタブ、モック、およびスパイです。

Stub() で十分な場合は、Mock() を使用しないでください。

可能であれば Spy() の使用は避けてください。 そうする必要があると、においが発生し、不適切なテストやテスト対象オブジェクトの不適切な設計を示唆する可能性があります。

于 2016-02-05T20:21:59.940 に答える