JUnit Easymock Неожиданный вызов метода - PullRequest
6 голосов
/ 22 января 2010

Я пытаюсь настроить тест в 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*.

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

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

Спасибо.

Ответы [ 4 ]

14 голосов
/ 31 мая 2010

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

9 голосов
/ 22 января 2010

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

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

5 голосов
/ 29 января 2011

Сопоставление 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 имеет возможность ожидать, что объект будет построен, так что вы можете посмотреть на это, если хотите.

1 голос
/ 20 сентября 2016

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

...