Как макетировать части службы и тестировать другие? - PullRequest
0 голосов
/ 02 января 2012

Я использую easymock и высмеиваю свой класс UserService.

В моем UserService есть несколько методов:

boolean canUserLogin(..);
boolean canUserJoinClass(...);

Теперь некоторые методы вызывают друг друга, и еслиЯ тестирую метод № 1. Я хочу заглушить / смоделировать методы № 2 и методы № 3, которые вызываются в методе № 1.

Что меня смущает, так это как я могу издеваться над частью класса и оставлять другиезапустить реальный код?

Итак, я хочу на самом деле протестировать UserService.method # 1, но смоделировать UserService.method # 2 и UserService.method # 3, которые метод # 1 вызывает внутри.

Ответы [ 4 ]

3 голосов
/ 02 января 2012

Указав возвращаемые значения для методов, которые вы хотите смоделировать; см. easymock docs для примеров.

  • В разделе «Указание возвращаемых значений» обсуждается создание возвращаемых значений для ложных методов.
  • В разделе «Частичная насмешка» (внизу) обсуждаются насмешливые настоящие классы.

Я согласен с документами (и другими ответами), что это может быть признаком схематичного дизайна. Без дальнейших подробностей трудно сказать, насколько он схематичен, если он вообще есть.

1 голос
/ 02 января 2012

Я знаю, что Mockito поддерживает «шпионаж» на реальных объектах.Я не мог найти эквивалент в Easy Mock.Поэтому я не уверен, что вы сможете это сделать.

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

Кроме того, всякий раз, когда вам нужно беспокоиться о реализации метода (метод 1 в данном случае)то есть тот факт, что он вызывает method2 и method3, особенно одного и того же класса, звучит для меня как утечка инкапсуляции.

1 голос
/ 02 января 2012

Вы можете проверить какую-нибудь библиотеку, например Easymock, но я не уверен, сможет ли она это сделать.

А вот мое решение без сторонней библиотеки.Создайте подкласс UserService и переопределите метод, который вы хотите смоделировать.

class SubUserService{

  @override
  boolean canUserJoinClass(...){
    return false;
  }

}

Но обратите внимание, что метод макета не может быть закрытым., вы должны рефакторировать ваши методы для различных классов.

0 голосов
/ 02 января 2012

Mocking предназначен для использования в зависимости, поэтому вы можете проводить тестирование изолированно. В этом случае у вас нет никаких зависимостей, так как методы, которые вы вызываете, находятся в одном классе. Так что я бы не стал здесь издеваться.

Если методы 2 и 3 настолько сложны, что вы хотите имитировать их при тестировании метода 1, то, возможно, вам следует разделить их на их собственный класс (классы), чтобы вы могли легко их смоделировать.

...