EasyMock 在没有匹配器的方法调用记录中抛出匹配器错误?

EasyMock throwing matcher error on method call recording with no matchers?

我正在使用 EasyMock 3.4 并进行了单元测试,我收到了一个非常奇怪的错误。

堆栈跟踪是:

java.lang.IllegalStateException: 0 matchers expected, 1 recorded.
This exception usually occurs when matchers are mixed with raw values when recording a method:
    foo(5, eq(6));  // wrong
You need to use no matcher at all or a matcher for every single param:
    foo(eq(5), eq(6));  // right
    foo(5, 6);  // also right
    at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:51)

我的单元测试如下:

    @Test
    public void testAddOrUpdateGuestMessageScenario(){
        final Session mockSession = EasyMock.createMock(Session.class);
        final Query mockQuery = EasyMock.createMock(Query.class);
        final Transaction mockTransaction = EasyMock.createMock(Transaction.class);
        final GuestMessageScenarioBO guestMessageScenarioBOMock = EasyMock.createMock(GuestMessageScenarioBO.class);
        final MessageCampaignBO messageCampaignBOMock = EasyMock.createMock(MessageCampaignBO.class);
        final InboundMessageSimulatorBO inboundMessageSimulatorBOMock = EasyMock.createMock(InboundMessageSimulatorBO.class);

        EasyMock.expect(guestMessageScenarioBOMock.getInboundMessageSimulatorBO()).andReturn(inboundMessageSimulatorBOMock).anyTimes();
        EasyMock.expect(inboundMessageSimulatorBOMock.getMessageCampaignBO()).andReturn(messageCampaignBOMock);
        EasyMock.expect(inboundMessageSimulatorBOMock.getCreateDate()).andReturn(null);
        EasyMock.expect(messageCampaignBOMock.getMessageCampaignRecordId()).andReturn(1234L);
        EasyMock.expect(mockSession.get(MessageCampaignBO.class, 1234L)).andReturn(messageCampaignBOMock);

        guestMessageScenarioBOMock.setCreateDate(EasyMock.isA(Timestamp.class));
        guestMessageScenarioBOMock.setUpdateDate(EasyMock.isA(Timestamp.class));
        inboundMessageSimulatorBOMock.setMessageCampaignBO(messageCampaignBOMock);
        inboundMessageSimulatorBOMock.setCreateDate(EasyMock.isA(Timestamp.class));
        inboundMessageSimulatorBOMock.setUpdateDate(EasyMock.isA(Timestamp.class));
        inboundMessageSimulatorBOMock.setGuestBusinessRuleUsageIndicator(true);

        EasyMock.expect(mockSession.createQuery(EasyMock.isA(String.class))).andReturn(mockQuery);      
        EasyMock.expect(mockSessionFactory.openSession()).andReturn(mockSession).anyTimes();
        mockSession.close();
        EasyMock.expectLastCall();
        EasyMock.expect(mockSession.beginTransaction()).andReturn(mockTransaction);
        mockSession.saveOrUpdate(EasyMock.isA(GuestMessageScenarioBO.class));
        mockTransaction.commit();
        EasyMock.replay(mockSessionFactory, mockSession, mockQuery,mockTransaction, guestMessageScenarioBOMock, inboundMessageSimulatorBOMock, messageCampaignBOMock);
        guestMessageScenarioDAO.addOrUpdateGuestMessageScenario(guestMessageScenarioBOMock);
    }

它抱怨的线路是:

EasyMock.expect(guestMessageScenarioBOMock.getInboundMessageSimulatorBO()).andReturn(inboundMessageSimulatorBOMock).anyTimes();

我知道在 EasyMock 中,你不能在方法调用中将匹配器与实际的 values/objects 混合使用,否则它会抛出错误,但很明显,看那段代码,根本就没有匹配器被使用,从来没有介意混合任何东西,因为 guestMessageScenarioBOMock 上的那个方法甚至不接受任何参数。

知道它在抱怨什么吗?

更新:包括@Before 方法

@Before
public void onSetup() {
    mockSessionFactory = EasyMock.createMock(SessionFactory.class);
    guestMessageScenarioDAO = new GuestMessageScenarioDAO();
    guestMessageScenarioDAO.setSessionFactory(mockSessionFactory);
}

这个问题与以下事实有关:在之前的测试中,模拟对象记录了一个方法调用,但后面没有预期。

发生这种情况时,EasyMock 会尝试将预期与记录的方法调用相匹配,即使在另一个测试中也是如此。

mockedObj.doSomething();

EasyMock.expectLastCall(); //This was missing and is needed.

希望这对其他人有帮助。