Как смоделировать метод, который основан на обновлении изменяемых объектов - PullRequest
0 голосов
/ 17 октября 2011

У меня есть метод, который не возвращает значение.Вместо этого он принимает список и изменяет членов этого списка.Очевидно, что сам список является изменчивым, как и его члены.

EG: Я хочу высмеять это:

    void modifyRequests(List<MutableObject> requests);

Ответы [ 3 ]

4 голосов
/ 17 октября 2011

Что ж, различные фреймворки для имитации do предоставляют способы сделать это (выполнение пользовательских действий, использующих параметры при вызове метода) - но я бы настоятельно рекомендовал не с использованием имитации.Если вы действительно не хотите проверить протокол между вашим тестируемым классом и его соавторами, вам следует подумать о написании фальшивого вместо макета.Затем вы можете заставить фальшивое поведение вести себя так, как вам нравится - и обычно (IME) вы получаете более простой тестовый код.

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

2 голосов
/ 17 октября 2011

Если вы издеваетесь над этим методом, почему код, использующий этот метод, должен знать, изменил ли вызов modifyRequests() что-нибудь?

Другими словами, вы должны иметь возможность смоделировать этот метод как запретный, и код, вызывающий его, должен по-прежнему функционировать.

В противном случае код, вызывающий этот метод, и сам метод слишком тесно связаны.

2 голосов
/ 17 октября 2011

С Mockito (Полагаю, другие фальшивые фреймворки тоже могут это делать):

doAnswer(new Answer() {
  public Object answer(InvocationOnMock invocation) {
      Object[] args = invocation.getArguments();
      List<MutableObject> arg = args[0];
      MutableObject obj = arg.get(0);
      //...
      return null;
  }})
.when(mock).modifyRequests();

Гадкий, тебе не кажется? Я настоятельно рекомендую извлечь этот анонимный внутренний класс и назвать его описательно. Я рекомендую еще сильнее реорганизовать ваш код и просто вернуть List<MutableObject> requests (или, возможно, вернуть измененную копию - передаваемые объекты, которые нужно изменить, немного неуклюже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...