PHPUnit: можно ли одновременно замокапить и класс, и интерфейс?
Дисклеймер: я понимаю, что есть обходные решения данной задачи, но интересует именно наиболее нативный способ реализации.
У нас есть интерфейс, который мы хотим отлавливать через try catch. Реальных классов, реализующих этот интерфейс, еще не существует, мы делаем этот отлов только на случай, если библиотека, в которой этот интерфейс реализуется, получит новые классы исключений с этим интерфейсом. В коде, который работает вокруг этого try catch, у данного исключения используется метод getMessage().
Соответственно, нам нужно получить мок интерфейса, у которого будет метод getMessage(). Просто взять и указать данный метод через setMethods() невозможно - PHPUnit проверит, есть ли такой метод в интерфейсе, и выдаст ошибку. И в итоге нам нужно получить мод интерфейса с дополнительным методом.
Вопрос: мы можем взять реально существующий класс Exception, указать неким образом, что он должен реализовывать наш интерфейс, и получить такой мок? Или нативными средствами PHPUnit данная задача не решается?
Я согласен с вашим уточнением. Но интересно, можно ли все-таки так это сделать. В целом я пока что решил это через создание прямо рядом с тестом FakeException, который реализует все, что нужно, и это выглядит вполне пристойным решением, но вдруг.
BoShurik, я понял ваш ответ, и наверное он по сути своей верный. Только подскажите, он отличается чем-либо от того ответа, в ветке которого мы общаемся? Если да, то опубликуйте, пожалуйста, свой комментарий как ответ с разъяснением этого отличия. Если нет, помечу данный ответ как верный, чтобы людям потом удобно было :-)
Ну и собственно я это решил созданием прямо в папке тестов, где это все требуется, фейковых классов, по классу на файл. Выглядит, как по мне, чуть эстетичнее, чем писать его прямо в коде, да и переиспользовать можно.
Ну и собственно я это решил созданием прямо в папке тестов, где это все требуется, фейковых классов, по классу на файл. Выглядит, как по мне, чуть эстетичнее, чем писать его прямо в коде, да и переиспользовать можно.
Думаю, это оптимальное решение. Оно теряется за формулировкой вопроса :)
Только подскажите, он отличается чем-либо от того ответа, в ветке которого мы общаемся?
Нет, просто логическое продолжение предложенного Максим Федоров, пусть поправит ответ (и лучше с упоминанием оптимального решения :)