JMock意外调用

时间:2011-11-14 15:49:00

标签: java junit jmock assertion

下面我只想模拟一个名为TestWrapper的类,并在其上设置'允许'expecations。但是,在设定期望时我会收到错误。当使用easymock并设定期望时,这似乎不会发生

import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
import org.junit.Before;
import org.junit.Test;

import java.math.BigDecimal;

public class CustomerPaymentProgramConverterTest {

    TestWrapper paymentType;

    Mockery mockery = new JUnit4Mockery() {{
            setImposteriser(ClassImposteriser.INSTANCE);
    }};

    @Before
    public void setupMethod() {

      paymentType = mockery.mock(TestWrapper.class);

    }

    @Test
    public void testFromWebService() {

        mockery.checking(new Expectations() {{

                    //debugger throws error on the line below.
                    allowing(paymentType.getScheduledPaymentAmount());
                    will(returnValue(new BigDecimal(123)));
                    allowing(paymentType.getScheduledPaymentConfirmationNumber());
                    will(returnValue(121212L));
        }});

    }
}

TestWrapper.class

 //Class I am mocking using JMock
 public class TestWrapper {

     public  java.math.BigDecimal getScheduledPaymentAmount() {
         return new BigDecimal(123);
     }
     public  long getScheduledPaymentConfirmationNumber() {
         return 123L;
     }
}

断言错误..

java.lang.AssertionError: unexpected invocation: paymentProgramScheduledPaymentTypeTestWrapper.getScheduledPaymentAmount()
no expectations specified: did you...
 - forget to start an expectation with a cardinality clause?
 - call a mocked method to specify the parameter of an expectation?
what happened before this: nothing!
    at org.jmock.internal.InvocationDispatcher.dispatch(InvocationDispatcher.java:56)
    at org.jmock.Mockery.dispatch(Mockery.java:218)
    at org.jmock.Mockery.access$000(Mockery.java:43)
    at org.jmock.Mockery$MockObject.invoke(Mockery.java:258)

1 个答案:

答案 0 :(得分:3)

您错误地使用了JMock API。它应该是

public void testFromWebService() {

    mockery.checking(new Expectations() {{

                //debugger throws error on the line below.
                allowing(paymentType).getScheduledPaymentAmount();
                will(returnValue(new BigDecimal(123)));
                allowing(paymentType).getScheduledPaymentConfirmationNumber();
                will(returnValue(121212L));
    }});

}

这就是说当你调用被测试的方法时(你在测试中似乎没有这样做),你会希望调用这些方法来返回这些值。 PaymentType将是您正在模拟的测试类中的依赖项。

请参阅JMock Getting Started

此外,您在@Before方法中有一个compliation错误