1

ですから、私はちょっと複雑な問題を抱えています。大量のコードをコピーする代わりに、同様の例で説明します。問題は、JMockitの使い方がよくわからないということです。

私はインターフェースを持っています:

public interface IRsrcResolver {
 RsrcSet getForQuery(Query, RsrcContext, int);
}

それの実際の実装があります-それはちょっと激しいです。そこで、nullを返すだけのモックバージョンを作成しました。次に、適切な値を返す[nonstrict]expectationを設定します。テストをテストに変更します。

コード内:

public class MockRsrcResolver implements IRsrcResolver { 
  RsrcSet getForQuery(Query, RsrcContext, int) { return null; } 
}

Testクラスで実装してから、期待値を設定します(StateEngineはRsrcResolverを使用します)

    public class StateEngineTest {
      @Mocked
      public IRsrcResolver rsrcResolver;
      @Mocked
      public RsrcSet rsrcSet;

      @Mocked
      private StateEngine stateEngine;


      public void setUp () throws Exception {
        stateEngine = new StateEngine ();
        rsrcResolver = new MockRsrcResolver ();
        rsrcSet = new RsrcSet ();

        new NonStrictExpectations () {
          {
            rsrcResolver.getForQuery((Query) any, (RsrcContext)any, anyInt);
            result = rsrcSet;
          }
        }
      }


    @Test
    public void testSetState () {
      /*... does something that calls getForQuery (...) on an IRsrcResolver ...*/
      stateTest.doSomething ();
      /* ... assert assert assert ... */
    }  
  }

doSomethingには、次のようなものがあります。

  IRsrcResolver m_rsrcResolver = new RsrcResolver ()
  RsrcSet m_rsrcSet = m_rsrcResolver.getQuery (query, rsrcCtx, 4);
  m_rsrcSet.doSomethingElse ();

m_rsrcSetはnull値を取得し、デバッグは、期待値を使用する代わりに、nullMockRsrcResolverを呼び出すことを示します...この方法でそれを行うのは間違っていますか?あなたが持っているかもしれないアドバイスをありがとう!

4

1 に答える 1

1

JMockitを使用すると多くの魔法が発生するため、JMockitを理解するのは簡単ではありません。これは、非常に直感的ではありません(非常に強力ですが)。

あなたの状況では、 (テストされたコードでインスタンス化されている)MockRsrcResolverメソッドの呼び出しをモックしたいので、クラスは役に立たないようです。RsrcResolver

期待値のモック変数の誤用があります。rsrcResolverrsrcSetおよびstateEngine値を指定しないでください。これらは実際には、JMockitが魔法のように生成するモックインスタンスのプレースホルダーです。

解決策1

RsrcSetモックする必要がない場合、このメソッドをモックする方法は次のとおりです。

final RsrcSet queryResult = new RsrcSet();
// (insert initialization of queryResult here)

new NonStrictExpectations () {
  RsrcResolver rsrcResolver;
  {
    rsrcResolver.getForQuery((Query) any, (RsrcContext)any, anyInt);
    result = queryResult
  }
}

「モックプレースホルダー」変数を、テストクラスのメンバーとしてではなく、期待値のメンバーとして宣言していることに注意してください。おそらく後者も機能しますが、私にはわかりません(JMockitで同じ結果を達成する方法はたくさんあります)。ただし、重要な点は、これらの変数を再割り当てしないことです。

上記の期待は、「メソッドのすべての呼び出しをインターセプトし、代わりにインスタンスRsrcResolver#getForQueryを返す」ことを意味します。queryResult実際、厳密でない期待値を使用した場合の正確な動作についてはわかりません(私は主に厳密な期待値を使用します)。多分それは次のことを意味します:「のすべてのメソッドの呼び出しをインターセプトしRsrcResolver、何もせずにデフォルト値を返します。しかし、メソッドの特殊なケースではRsrcResolver#getForQuery、インスタンスを返しqueryResultます。」

解決策2

もしモックする必要がある場合、これが私がこのメソッドをモックした方法ですRsrcSet#doSomethingElse

new NonStrictExpectations () {
  RsrcResolver rsrcResolver;
  RsrcSet rsrcSet;
  {
    rsrcResolver.getForQuery((Query) any, (RsrcContext)any, anyInt);
    result = rsrcSet;
    rsrcSet.doSomethingElse();
  }
}

上記の期待は、「メソッドのすべての呼び出しをインターセプトし、代わりにRsrcResolver#getForQueryモックされたインスタンスを返すことを意味しRsrcSetます。このモックされたインスタンスは、呼び出されても何もしません」。もちろん、doSomethingElse値を返す必要がある場合は、result =命令を使用できます。

于 2010-09-09T09:33:35.820 に答える