JUnit Easymock Неожиданный вызов метода

Я пытаюсь настроить тест в JUnit с EasyMock, и у меня возникла небольшая проблема, с которой я не могу справиться. Я надеялся, что кто-то здесь может помочь.

Вот упрощенная версия метода, который я пытаюсь проверить:

public void myMethod() {
    //(...)
    Obj myObj = this.service.getObj(param);
    if (myObj.getExtId() != null) {
      OtherObj otherObj = new OtherObj();
      otherObj.setId(myObj.getExtId());
      this.dao.insert(otherObj);
    }
    //(...)
}

Итак, используя EasyMock, я издевался над вызовом service.getObj(myObj), и это отлично работает.

Моя проблема возникает, когда JUnit выполняет вызов dao.insert(otherObj). EasyMock бросает *Unexpected Method Call* на это.

Я был бы не против издеваться над этим dao в своем тесте и использовать на нем expectLastCall().once();, но это предполагает, что у меня есть дескриптор «otherObj», который передается в качестве параметра во время вставки... Чего, конечно, я не делаю, поскольку он условно созданный в контексте тестируемого метода.

Кто-нибудь сталкивался с этим и как-то решил?

Спасибо.


person Lancelot    schedule 21.01.2010    source источник


Ответы (4)


Если вы не можете получить ссылку на сам объект в своем тестовом коде, вы можете использовать EasyMock.anyObject() в качестве ожидаемого аргумента для вашего insert метода. Как следует из названия, ожидается, что метод будет вызываться с... ну, с любым объектом :)

Возможно, это немного менее строго, чем сопоставление с точным аргументом, но если вас это устраивает, попробуйте. Не забудьте включить приведение к OtherObj при объявлении ожидаемого вызова метода.

person DoctorRuss    schedule 22.01.2010

Вы также можете использовать EasyMock.isA(OtherObj.class) для большей безопасности типов.

person dplass    schedule 31.05.2010

Сопоставитель anyObject() отлично работает, если вы просто хотите обойти этот вызов, но если вы действительно хотите проверить, является ли созданный объект тем, что вы думали, вы можете использовать Capture. Это будет выглядеть примерно так:

Capture<OtherObj> capturedOtherObj = new Capture<OtherObj>();
mockDao.insert(capture(capturedOtherObj));
replay(mockDao);

objUnderTest.myMethod();

assertThat("captured what you expected", capturedOtherObj.getValue().getId(), 
           equalTo(expectedId));

Кроме того, PowerMock может ожидать, что объект будет создан, так что вы можете изучить этот если бы ты хотел.

person jhericks    schedule 29.01.2011

Также обратите внимание, что если вы используете EasyMock.createStrictMock();, порядок вызовов методов также важен, и если вы нарушите это правило, вызовет неожиданный вызов метода.

person Ad Infinitum    schedule 20.09.2016