1

以下は、独自のマッチャーを使用して作成したテストです。この場合、標準のマッチャーを使用できることはわかっていますが、実際のコードではもっと複雑なマッチャーが必要です。

テストに合格 - VG にチェックを入れます。問題は、IArgumentMatcher.matches()false を返すメソッドへの余分な呼び出しがあるように見えますが、テストに合格することです。

私が得る出力は次のとおりです。

30-09-2009 16:12:23 [main] ERROR - MATCH - expected[aa], actual[aa]
30-09-2009 16:12:23 [main] ERROR - MISMATCH - expected[aa], actual[bb]
30-09-2009 16:12:23 [main] ERROR - MATCH - expected[bb], actual[bb]

問題は、なぜ MISMATCH 行が表示されるのかということです。何か間違ったことをしたのでしょうか?

テストコードは次のとおりです。

package uk.co.foo;

import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.reset;
import static org.easymock.EasyMock.verify;
import junit.framework.TestCase;

import org.apache.log4j.Logger;
import org.easymock.EasyMock;
import org.easymock.IArgumentMatcher;

/**
 *
 */
public class BillTest extends TestCase { 

  private static Logger mLogger = Logger.getLogger(BillTest.class);

  private BillInterface mMockBill;

  public void testTwoCalls() throws Exception {
    BillsTestClass sut = new BillsTestClass();
    sut.setDao(mMockBill);

    expect(mMockBill.method1(eqBillMatcher("aa"))).andReturn("");
    expect(mMockBill.method1(eqBillMatcher("bb"))).andReturn("");
    replay(mMockBill);

    //test method
    sut.doSomething("aa");
    sut.doSomething("bb");

    verify(mMockBill);
  }

  public String eqBillMatcher(String aIn) {
    EasyMock.reportMatcher(new BillMatcher(aIn));
    return null;
  }

  @Override
  protected void setUp() throws Exception {
    super.setUp();
    mMockBill = createMock(BillInterface.class);
  }


  @Override
  protected void tearDown() throws Exception {
    super.tearDown();
    reset(mMockBill);
  }

  public class BillsTestClass {
    private BillInterface mDao;
    public void setDao(BillInterface aDao) {
      mDao = aDao;
    }

    public void doSomething(String aValue) {
      mDao.method1(aValue);
    }
  }

  public interface BillInterface {
    String method1(String aValue);
  }

  public class BillMatcher implements IArgumentMatcher {
    private String mExpected;

    public BillMatcher(String aExpected) {
      mExpected = aExpected;
    }

    /**
    * @see org.easymock.IArgumentMatcher#matches(java.lang.Object)
    *  {@inheritDoc}
    */
   public boolean matches(Object aActual) {
     if (aActual.equals(mExpected)) {
       mLogger.error("MATCH - expected[" + mExpected + "], actual[" + aActual + "]");
       return true;
     }
     mLogger.error("MISMATCH - expected[" + mExpected + "], actual[" + aActual + "]");
     return false;
   }

   /**
    * @see org.easymock.IArgumentMatcher#appendTo(java.lang.StringBuffer)
    *  {@inheritDoc}
    */
   public void appendTo(StringBuffer aBuffer) {
     aBuffer.append("boo(");
   }
  }
}
4

1 に答える 1

0

簡単なプレイで、何かが期待されるだけで順序を定義していないようです。モックを呼び出すたびに、一致し、まだ呼び出されていないものを見つけるまで、すべての期待値を順番に実行します。

だから:

expect(mMockBill.method1(eqBillMatcher("aa"))).andReturn("");
expect(mMockBill.method1(eqBillMatcher("aa"))).andReturn("");
expect(mMockBill.method1(eqBillMatcher("cc"))).andReturn("");

sut.doSomething("aa");

MATCH - 予想[aa]、実際[aa]

あなたが期待するように。初戦ヒット。

sut.doSomething("cc");

MISMATCH - 予想[aa]、実際の[cc]
MISMATCH - 予想[aa]、実際の[cc]
MATCH - 予想[cc]、実際の[cc]

ヒットするまで順番に (既に通過したものを含む) 1 つ 1 つ。

sut.doSomething("aa");

MATCH - 予想[aa]、実際の[aa]
MATCH - 予想[aa]、実際の[aa]

以前に呼び出されたことのないヒットが見つかるまで、それぞれが順番に呼び出されます。

これにより、「unexpected method call, expected 1, actual 1 ( +1 )」の行にエラー メッセージを表示できます。

--

コメント用コード -

private boolean used = false;

<snip/>

public boolean matches(Object aActual) {
   if (used) {
     return false;
   }
   used = true;
于 2009-10-01T08:46:39.827 に答える