//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中的代码运行良好?
答案 0 :(得分:0)
EasyMock.anyDouble
和EasyMock.anyObject
不适合在重播模式中使用。它们用于在记录模式下设置您的期望。
在第一次测试(testOperateCar
)中使用此功能:
easyMockMatcherUnderTest.operateObject(new Car());
在你的第二个(testOperateDouble
)中有类似的东西:
easyMockMatcherUnderTest.operateDouble(1.0);
顺便说一句,您无需致电EasyMock.expectLastCall
。只有在期望多次调用void方法时才有用,例如:
mock.operateCar(EasyMock.anyObject(Car.class));
EasyMock.expectLastCall().times(3);