在EasyMock中使用匹配器时,对象和基本类型之间的区别是什么

时间:2015-03-16 10:48:51

标签: easymock matcher

//service to mock
public interface ServiceToMock {
public void operateDouble(Double dbValue);
public void operateCar(Car car);
}

//class under test
public class ClassUnderTest {
ServiceToMock service;  
public void operateDouble(Double dbValue){
    service.operateDouble(dbValue);
}   
public void operateObject(Car car){
    service.operateCar(car);
 }
}

//单元测试类

@RunWith(EasyMockRunner.class)
public class TestEasyMockMatcherUnderTest {
@TestSubject
private final ClassUnderTest easyMockMatcherUnderTest = new ClassUnderTest();

@Mock
private ServiceToMock mock;

@Test
public void testOperateCar() {
    //record
    mock.operateCar(EasyMock.anyObject(Car.class));
    EasyMock.expectLastCall();

    // replay
    EasyMock.replay(mock);
    //matcher here...
    easyMockMatcherUnderTest.operateObject(EasyMock.anyObject(Car.class));
    //easyMockMatcherUnderTest.operateObject(new Car());

    // verify
    EasyMock.verify(mock);
}

@Test
public void testOperateDouble() {
    // record
    mock.operateDouble(EasyMock.anyDouble());
    EasyMock.expectLastCall();

    // replay
    EasyMock.replay(mock);
    easyMockMatcherUnderTest.operateDouble(EasyMock.anyDouble());

    // verify
    EasyMock.verify(mock);
 }
}

如上面的代码所示,我打算测试两个方法(operateDouble,operateObject)。但是事情有点奇怪,因为在performDouble块中一切运行正常,而编译器抱怨“非法状态异常:1匹配预期,2记录。”#34;当runnig操作对象时。如果注释方法的操作是双重的,那么compaint就会消失。那么Double和我的自定义对象Car之间有什么区别,因为Double也可以被认为是一个对象。为什么在将performDouble方法注释掉时,operaObject中的代码运行良好?

1 个答案:

答案 0 :(得分:0)

EasyMock.anyDoubleEasyMock.anyObject不适合在重播模式中使用。它们用于在记录模式下设置您的期望。

在第一次测试(testOperateCar)中使用此功能:

easyMockMatcherUnderTest.operateObject(new Car());

在你的第二个(testOperateDouble)中有类似的东西:

easyMockMatcherUnderTest.operateDouble(1.0);

顺便说一句,您无需致电EasyMock.expectLastCall。只有在期望多次调用void方法时才有用,例如:

mock.operateCar(EasyMock.anyObject(Car.class));
EasyMock.expectLastCall().times(3);