Как смоделировать статический метод с помощью mockito для проведения юнит-теста - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть такой метод.

 public Response post(String json) {

   EventList list = Recorder.getRecorders();
   if (null == list || list.isEmpty()) {
     throw new ServiceUnavailableException("An Recorder is either not configured");
  }
  String targetIUrl = list.getNext().getBase();
  String targetV2Url = targetUrl + "/v2";

 // other processes......
}
  1. Я хочу смоделировать Recorder.getRecorder () и сделать что-то вроде when (Recorder.getRecorder ()). ThenReturn (null) и проверьте, если выбрасываете 503 исключения.Но getRecorder () - это статический метод.Я знаю, что Mockito не может издеваться над статическим методом, но я все еще хочу знать, возможно ли изменить какой-либо код, сделанный в этом тестируемом, без использования Powermock или других библиотек.

  2. Если я имитирую Recorder, сделайтеЯ должен изменить способ публикации (String JSON, Recorder Recorder)?Иначе, как я могу заставить этот макет взаимодействовать с методом?

1 Ответ

0 голосов
/ 14 декабря 2018

Если вы хотите смоделировать поведение getRecorders() без использования библиотеки для проверки статических методов (таких как Powermock), вам придется извлечь статический вызов изнутри post().Для этого есть несколько вариантов:

  1. Передать EventList в post()

    public post(String json, EventList list) {
        ...
    }
    
  2. Ввести EventList вкласс, который содержит post()

    public class TheOneThatContainsThePostMethod {
        private EventList eventList;
    
        public TheOneThatContainsThePostMethod(EventList eventList) {
            this.eventList = eventList;
        }
    
        public post(String json) {
            if (null == this.eventList || this.eventList.isEmpty()) {
                throw new ServiceUnavailableException("An Recorder is either not configured");
            }
        }
    }
    
  3. Скрыть статический вызов метода внутри другого класса и внедрить экземпляр этого класса в post() или класскоторый содержит post().Например:

    public class RecorderFactory {
        public EventList get() {
            return Recorder.getRecorders();
        }
    }
    
    public class TheOneThatContainsThePostMethod {
        private RecorderFactory recorderFactory;
    
        public TheOneThatContainsThePostMethod(RecorderFactory recorderFactory) {
            this.recorderFactory = recorderFactory;
        }
    
        public post(String json) {
            EventList list = recorderFactory.getRecorders();
            ...
        }
    }
    
    // Or ...
    
    public post(String json, RecorderFactory recorderFactory) {
        EventList list = recorderFactory.getRecorders();
        ...
    }
    

При первых двух подходах ваш тест может просто вызвать post(), предоставляя (1) ноль EventList;(2) пустой EventList ... тем самым позволяя вам протестировать поведение «выбросить 503 исключение».

При третьем подходе вы можете использовать Mockito, чтобы высмеивать поведение RecorderFactory для возврата(1) ноль EventList;(2) пустое EventList ... что позволяет вам проверить поведение «выбросить 503 исключение».

...