Я тестирую метод, похожий на следующий:

car.driveCar("carName", problematicMethod().getBrand());

problematicMethod() - это синглтон, который имеет дело с контекстом безопасности. Обычно problematicMethod() не возвращает Nullpointer, но при модульном тестировании он это делает. Я не могу изменить исходный код метода, и его нельзя смоделировать с помощью Mockito из-за его дизайна. driveCar() ничего не возвращает.

Я пробовал следующее, чтобы увидеть, не подавит ли это оценка строки в целом:

Mockito.doNothing().when(car).driveCar(Mockito.eq("carName"), Mockito.any());

Но он по-прежнему дает мне исключение Nullpointer, потому что пытается оценить второй аргумент.

0
jeebface 17 Фев 2016 в 19:48

2 ответа

Лучший ответ

Mockito ничего не может сделать для решения вашей проблемы:

   car.driveCar("carName", problematicMethod().getBrand());
// [1] [5]      [2]        [3]                 [4]

порядок оценки в Java гарантирует, что вызов problematicMethod() произойдет до вызова driveCar, поэтому насмешка driveCar не сделает ничего, чтобы предотвратить вызов problematicMethod. Хотя вы знаете, что Mockito заставит вызов driveCar ничего не делать, среда выполнения Java не может этого знать.


Вы можете попробовать рефакторинг вызова problematicMethod().getBrand(), а затем протестировать против переопределения или шпиона Mockito:

public class YourClass {
  public ReturnType yourMethod() {
    car.driveCar("carName", getBrand());
  }

  /** Gets brand via problematicMethod(). Package private for test overrides. */
  Brand getBrand() {
    return problematicMethod().getBrand();
  }
}

(Обратите внимание, что этот метод может также применяться ко всему вызову метода driveCar, и вы можете извлечь его в отдельный объект, если у вас достаточно реализаций, чтобы гарантировать шаблон стратегии.)

0
Jeff Bowman 17 Фев 2016 в 17:55

Вы описываете "problematicMethod ()" как синглтон. Методы не синглтоны. Классы могут быть одиночными.

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

Если это правда, вам придется использовать концепцию «шпиона» в Mockito. Прочтите документацию Mockito о Spy. Это сделает ваши тесты более запутанными и сложными для понимания, но вы уже сделали это с вашим классом. :)

0
David M. Karr 17 Фев 2016 в 17:55