スポックスパイ/モックは、呼び出しを登録しません

サニー:

私はちょうど2つの他のメソッドを呼び出す私のテストクラスのメソッドを持っています。私はチェックがこれらの2つの方法が実際にinvocedしていることというテストを記述しようとしていますが、何の呼び出しが登録されていません。私がテストしてるのJavaコード:

    public void populateEdgeInfo(Map<Actor, SchedulableNode> knownNodes) {
        populateDestinationInfo(knownNodes);
        populateSourceInfo(knownNodes);
    }

私のテストコード:

def "Populating edge info means both source and destination information will be populated" () {
    given:
    actor.getDstChannels() >> []
    actor.getSrcChannels() >> []
    SchedulableNode schedulable = Spy(SchedulableNode, constructorArgs: [actor])

    when:
    schedulable.populateEdgeInfo([:])

    then:
    1 * schedulable.populateDestinationInfo(_)
    1 * schedulable.populateSourceInfo(_)
}

登録された唯一のものはpopulateEdgeInfoへの呼び出しです。そこに何かが私が間違ってやっていることは明らかですか?また、無駄に代わりスパイのモックを使用してみました。

kriegaex:

私が作成しようとしましたMCVEをあなたのまばらな情報から、あなたのテストで何の問題も見つかりませんでした。

package de.scrum_master.stackoverflow.q60926015;

import java.util.List;

public class Actor {
  public List getDstChannels() {
    return null;
  }

  public List getSrcChannels() {
    return null;
  }
}
package de.scrum_master.stackoverflow.q60926015;

import java.util.Map;

public class SchedulableNode {
  private Actor actor;

  public SchedulableNode(Actor actor) {
    this.actor = actor;
  }

  public void populateEdgeInfo(Map<Actor, SchedulableNode> knownNodes) {
    populateDestinationInfo(knownNodes);
    populateSourceInfo(knownNodes);
  }

  public void populateDestinationInfo(Map<Actor, SchedulableNode> knownNodes) {}

  public void populateSourceInfo(Map<Actor, SchedulableNode> knownNodes) {}
}
package de.scrum_master.stackoverflow.q60926015

import spock.lang.Specification

class SchedulableNodeTest extends Specification {
  def actor = Mock(Actor)

  def "Populating edge info means both source and destination information will be populated"() {
    given:
    actor.getDstChannels() >> []
    actor.getSrcChannels() >> []
    SchedulableNode schedulable = Spy(SchedulableNode, constructorArgs: [actor])

    when:
    schedulable.populateEdgeInfo([:])

    then:
    1 * schedulable.populateDestinationInfo(_)
    1 * schedulable.populateSourceInfo(_)
  }
}

ことは、あなたのコードは、鉱山から異なっていなければならないということ。私の推測では、両方のことであるpopulate*方法であるprivateあなたのクラスにモックが動的プロキシを使用し、後者は技術的にサブクラスであるため、それは不可能それらを模擬することができます。サブクラスは、このように動的なプロキシがインターセプト(呼び出しに)それらをすることはできませんけれども、民間のスーパークラスのメソッドが表示されません。

可能な解決策:

  • 過指定テストをし、内部の相互作用のテストを停止します。これは、テスト脆性を行い、あなたはまた、テスト対象のクラスをリファクタリング場合は、多くの場合、それをリファクタリングする必要があります。

  • 作るpopulate*方法は、保護または公衆が正しくない場合は、パッケージスコープ。そして、あなたはそれらをスタブし、それらの上に相互作用を確認することができます。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=373934&siteId=1