Как Jmock используется с HttpSession и HttpServletRequest - PullRequest
0 голосов
/ 23 октября 2008

Я новичок в jmock и пытаюсь смоделировать HttpSession. Я получаю:

java.lang.AssertionError: неожиданный вызов: httpServletRequest.getSession () ожидания не указаны: ты ... - забыть начать ожидание с кардинальной оговорки? - вызвать смоделированный метод, чтобы указать параметр ожидания?

метод испытаний:

@ Test

public void testDoAuthorization(){

    final HttpServletRequest request = context.mock(HttpServletRequest.class);
    final HttpSession session = request.getSession();

    context.checking(new Expectations(){{
       one(request).getSession(true); will(returnValue(session));
   }});

    assertTrue(dwnLoadCel.doAuthorization(session));
}

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

Ответы [ 2 ]

2 голосов
/ 23 октября 2008

Вам не нужно издеваться над объектом запроса. Поскольку метод, который вы тестируете (dwnLoadCel.doAuthorization()), зависит только от объекта HttpSession, это то, что вы должны высмеивать. Итак, ваш код будет выглядеть так:

public void testDoAuthorization(){
    final HttpSession session = context.mock(HttpSession.class);

    context.checking(new Expectations(){{
        // ???
    }});

    assertTrue(dwnLoadCel.doAuthorization(session));

}

Возникает вопрос: что вы ожидаете от SUT на самом деле делать с объектом сеанса? Вы должны выразить в своих ожиданиях вызовы session и их соответствующие возвращаемые значения, которые должны привести к doAuthorization возвращению true.

1 голос
/ 23 октября 2008

Я думаю, вам нужно сообщить контексту JMock, сколько раз вы ожидаете, что метод будет вызван, прежде чем вы начнете его вызывать.

final HttpServletRequest request = context.mock(HttpServletRequest.class);

context.checking(new Expectations(){{
  one(request).getSession(true); will(returnValue(session));
}});

final HttpSession session = request.getSession();

Я не очень знаком с JMock, но действительно ли вас волнует в вашем dwnLoadCel модульном тесте, сколько раз вызываются определенные методы в объекте? Или вы просто пытаетесь протестировать свой класс, который зависит от HttpSession без реальной сессии? Если это последнее, то я думаю, что JMock для вас излишне.

Возможно, вы захотите либо создать класс, который реализует интерфейс HttpSession самостоятельно, только для целей модульного тестирования (заглушка), и запустить свои тесты без него, либо вы должны взглянуть на * 1008. * и определите, действительно ли должна иметь ссылку на HttpSession или просто нужны некоторые свойства в HttpSession. Рефакторинг dwnLoadCel зависит только от того, что ему действительно нужно (Map или определенное значение параметра в объекте Session) - это упростит ваш модульный тест (зависимость от контейнера сервлетов прощается).

Я думаю, что у вас уже есть какой-то уровень внедрения зависимостей в вашем классе, который уже тестируется, но вы можете зависеть от слишком широкого объекта. В блоге Google Test было много превосходных статей по DI в последнее время, которые могут оказаться полезными (я уверен, что есть).

...