в чем разница между объектом и примитивным типом при использовании сопоставителей в EasyMock

//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, operaObject). Но все немного странно, поскольку в блоке operaDouble все работает нормально, в то время как компилятор жалуется на «Исключение недопустимого состояния: 1 ожидаемых совпадений, 2 записанных». при запуске operaObject. И если закомментировать метод operaDouble, то компайнт исчезнет. Итак, в чем разница между Double и моим пользовательским объектом Car, поскольку Double также можно рассматривать как объект. И почему коды в operaObject работают хорошо, если закомментировать метод operaDouble?


person Essviv    schedule 16.03.2015    source источник


Ответы (1)


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);
person eee    schedule 30.03.2015