在套件测试期间,EasyMock表示0匹配器预计会有1个记录

hol*_*mes 16 easymock matcher

所以我一直在使用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)
Run Code Online (Sandbox Code Playgroud)

涉及的代码是这个小美女(修剪了一下):

    @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 );
    ...
}
Run Code Online (Sandbox Code Playgroud)

第一个期望是抛出异常.它真的没有意义.它说这是一个匹配器,但该方法甚至没有争论.奇怪的是,这只是在测试套件中!我正在@Before中创建一个新的模拟,所以它不应该从其他地方继承任何东西(不是其他方法会有一个匹配器)

那么,有什么想法吗?

ken*_*nny 11

我厌倦了看到这个与每个新的遗留代码库和EasyMock我必须合作.本书写了一个新的EasyMock测试,由于Matchers从未捕获过,所有突然的随机测试都开始失败.所以我去了解EasyMock如何存储这些Matchers.它使用了最后一个类LastControl,在该类中有一些threadlocals,其中存储了不同的东西.其中一个是Matchers.幸运的是,有一个静态方法可以将所有Matchers从仍然在那里的threadlocal中拉出来.所以这给了我这个想法(在同事的帮助下,谢谢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();
  }

}
Run Code Online (Sandbox Code Playgroud)

基本上让你的测试失败,Matchers错误扩展到这个类,你将确保Matchers被清理.请注意,这是一个替代方法.应该首先写出违规测试.但是,如果你不得不涉及5000多个测试,这是两个邪恶中的较小者.我希望这会帮助人们!


小智 2

我遇到了类似的问题。据我观察,甚至方法返回也是使用匹配器进行匹配的。因此,如果您的第一个方法因任何原因失败,则返回匹配的匹配器仍在堆栈中。这可能是为什么即使您的方法不带任何参数,您也会看到 1 个匹配器被记录的原因之一。基本上,第一个方法调用从未返回值。