лучшее решение для симуляции вызовов в Java

1

У меня есть следующий код:

handler = NodeHandler.getINodeHandler(localZone).getITspPlatformHandler().getITspProcessorManagementHandler();

Я издевался над этим так:

mockStatic(NodeHandler.class);
INodeHandler iNodeHandler = mock(INodeHandler.class,Mockito.RETURNS_DEEP_STUBS);
when(NodeHandler.getINodeHandler(localZone)).thenReturn(iNodeHandler);
ITspProcessorManagementHandler iTspProcessorManagementHandler =mock(ITspProcessorManagementHandler.class,Mockito.RETURNS_DEEP_STUBS);
when(iNodeHandler.getITspPlatformHandler().getITspProcessorManagementHandler()).thenReturn(iTspProcessorManagementHandler);

После нескольких строк кода приходит следующий вызов с цепочкой:

ITspTrafficProcessor processor = NodeHandler.getINodeHandler(localZone, localUI).getITspPlatformHandler().getITspProcessorManagementHandler()
                .getITspProcessorHandler(procs[i]).getITspTrafficProcessorHandler(0).getAttributes();

И я издевался над этим так:

when(NodeHandler.getINodeHandler(localZone,UI.CORBA)).thenReturn(iNodeHandler);
when(iNodeHandler.getITspPlatformHandler().getITspProcessorManagementHandler()(+1+).getITspProcessorHandler(anyString())
            .getITspTrafficProcessorHandler(anyInt()).getAttributes()).thenReturn(null);

Поэтому мой вопрос заключается в том, что я не могу найти лучшего решения, чем это, потому что проблема в том, что я скажу mockito о возврате null в обработчик вместо iTspProcessorManagementHandler, тогда я получаю исключение nullpointer в (+1+), но если я внесите следующие изменения в мой код:

INodeHandler iNodeHandler = mock(INodeHandler.class,Mockito.RETURNS_MOCKS);

Затем mockito высмеивает вызов каждого метода, а мои инструкции when-thenReturn не возвращают то, что я хочу, например, null. Так что любой совет, чтобы сделать лучшее решение????

Теги:
mockito

1 ответ

3
Лучший ответ

Мессиальное издевательство над этим является признаком того, что вы можете улучшить абстракцию. Я бы рассмотрел инкапсуляцию этой конкретной логики в вспомогательный интерфейс/класс или для ввода ожидаемого типа, возвращаемого "trainwreck" в метод/класс.

  • 0
    Я забыл написать, что я работаю над устаревшим кодом (или вы думаете о тестовом коде?)
  • 0
    Работа с устаревшим кодом может быть болезненной. Но старый код также может быть реорганизован. Подобные случаи - это шаг за шагом улучшить качество кода. В любом случае, если вам действительно нужно смоделировать железнодорожные аварии, как это, я считаю, что вам нужен каждый вызов метода в цепочке, чтобы вернуть макет, который вы можете настроить. Таким образом, вам нужно when и затем thenReturn для каждого из вызовов.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню