17

それで、私は EasyMock のクラス拡張機能をしばらく使用しています。突然、この例外が発生しますが、テスト スイート全体を実行した場合のみです。

java.lang.IllegalStateException: 0 matchers expected, 1 recorded.
at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:42)
at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:34)
at org.easymock.internal.ExpectedInvocation.<init>(ExpectedInvocation.java:26)
at org.easymock.internal.RecordState.invoke(RecordState.java:64)
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:24)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:56)
at org.easymock.classextension.internal.ClassProxyFactory$1.intercept(ClassProxyFactory.java:74)
at com.protrade.soccersim.data.emulator.matrix.PositionCategoryMatrix$$EnhancerByCGLIB$$c5298a7.getPossession(<generated>)
at com.protrade.soccersim.data.emulator.stats.team.PossessionCalculatorUnitTest.testDeterminePossessionHomeWin(PossessionCalculatorUnitTest.java:45)

関連するコードは、この小さな美しさです (少しトリミングされています)。

    @Before
public void setUp() throws Exception {
    homeTeam = createMock( PositionCategoryMatrix.class );
    awayTeam = createMock( PositionCategoryMatrix.class );
    ...
}

@Test
public void testDeterminePossessionHomeWin() {
    expect(homeTeam.getPossession()).andReturn( 0.15151515 );
    expect(awayTeam.getPossession()).andReturn( 0.01515152 );
    replay( homeTeam, awayTeam );
    ...
}

最初の期待で例外がスローされています。そして、それは本当に意味がありません。マッチャーを取得していると書かれていますが、メソッドは引数さえ取りません。そして奇妙なことに、それはテスト スイートの間だけです! @Before で新しいモックを作成しているので、他の場所から何かを継承するべきではありません (他のメソッドにマッチャーがあるわけではありません)。

それで、何かアイデアはありますか?

4

6 に答える 6

15

EasyMock を使用して作業しなければならなかった新しいレガシー コード ベースごとに、これを見るのにうんざりしていました。本によって新しい EasyMock テストを 1 つ作成すると、Matcher がキャプチャされないため、突然ランダムなテストがすべて失敗し始めます。そこで、EasyMock がこれらの Matcher をどのように格納するかを調べました。最終クラス LastControl を使用します。そのクラスには、さまざまなものが格納されるいくつかのスレッドローカルがあります。それらの 1 つはマッチャー用でした。運が良ければ、まだそこにあるスレッドローカルからすべてのマッチャーをプルするための静的メソッドがそこにあります。それで、これは私にこのアイデアを与えました(同僚の助けを借りて、Svenに感謝します、彼は信用を求めていました)

/**
 * Base class to make sure all EasyMock matchers are cleaned up.  This is not pretty but it will work
 * 
 * @author N069261KDS
 *
 */
public class BaseTest {

  @Before
  public void before(){
    LastControl.pullMatchers();
  }

  @After
  public void after(){
    LastControl.pullMatchers();
  }

}

基本的に、Matchers エラーで失敗するテストをこのクラスから拡張すると、Matchers が確実に消去されます。これは回避策であることに注意してください。問題のあるテストは、最初から正しく記述されている必要があります。しかし、5000 以上のテストをくぐり抜けなければならない場合、これは 2 つの悪のうち小さい方です。これが人々を助けることを願っています!

于 2014-02-19T08:27:53.730 に答える
4

これが「ばかげた」EasyMock バグに起因する誤ったメッセージである可能性があることは事実ですが、EasyMock API の無効な使用が原因である可能性も非常に高くなります。私の場合、メッセージはこの JUnit 3.8 テストから発生しました (そして、あなたと同じように、これは一連のテスト全体を実行したときにのみ発生し、Eclipse ではなく Maven 経由でのみ発生しました):

public void testSomething() {
    // Set up
    MyArgumentType mockArg = (MyArgumentType) EasyMock.anyObject(); // bad API usage

    // Invoke the method under test
    final String result = objectUnderTest.doSomething(mockArg);

    // Verify (assertions, etc.)
    ...
}

anyObject() を使用する代わりに、createMock(MyArgumentType.class) またはそのバリアントの 1 つを使用する必要がありました。何を考えていたのかわかりません。何百万ものこれらのテストを作成し、API を正しく使用しました。

紛らわしいのは、「wrong number of matchers」メッセージで失敗するテストは、API を間違って使用したテストであるとは限らないということです。これは、replay() または verify() メソッドを含むバグのあるテストの後に実行された最初のテストかもしれませんが、私はこれを実験的に検証していません。

于 2010-06-10T05:23:43.080 に答える
2

私は同様の問題に直面しています。私が観察したところによると、メソッドの戻り値でさえ、マッチャーを使用して照合されます。したがって、最初のメソッドが何らかの理由で失敗した場合でも、リターンマッチのマッチャーはスタックに残ります。これが、メソッドが引数を取らない場合でも、1つのマッチャーが記録されているのを確認している理由の1つである可能性があります。基本的に、最初のメソッド呼び出しは値を返しませんでした。

于 2010-03-25T06:13:27.273 に答える
2

私はちょうどこの問題に遭遇しました、そして私はそれを理解することができたと思います。私にとっては、Assert.assertEquals メソッドで EasyMock マッチャーを (誤って) 使用していた以前のテスト (別のクラスにある) が原因でした。

EasyMock は、最初の Expect メソッドが呼び出されるまで、報告された余分なマッチャーについて文句を言うことができなかったようです。

于 2011-08-29T18:09:32.847 に答える
2

同じエラーメッセージが表示されました。テスト中のクラスの呼び出しで isA() 宣言を (偶然) 使用していました

いえ

classUnderTest.callStateChanged(calls, isA(LoggingOnlyListener.class));

私が意味したとき:

classUnderTest.callStateChanged(calls, new LoggingOnlyListener());

そして、毎回失敗したのは、この後のテストでした。

于 2010-10-21T16:24:20.647 に答える
1

どのバージョンのEasymockを使用していますか?v.2.5.2のリリースに関する投稿
を読みましたが、以前のバージョンには

キャプチャのダムバグ

Easymock2.5.2+を使用してみてください

于 2010-05-27T08:26:19.050 に答える