Вопрос

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

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

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

@Тест

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));
}

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

Это было полезно?

Решение

Вам не нужно издеваться над объектом запроса.Поскольку метод, который вы тестируете (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.

Другие советы

Я думаю, вам нужно сообщить контексту 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 используйте интерфейс самостоятельно только для целей модульного тестирования (заглушка) и запускайте свои тесты на основе этого, или вам следует взглянуть на dwnLoadCel и определите, является ли это действительно должна быть ссылка на HttpSession, или если ему просто нужны некоторые свойства внутри HttpSession.Рефакторинг dwnLoadCel зависеть только от того, что ему на самом деле нужно (a Map или определенное значение параметра внутри объекта сеанса) - это упростит ваш модульный тест (зависимость от контейнера сервлета исчезает).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top