stanislav-belichenko
@stanislav-belichenko
Backend PHP Developer

PHPUnit: можно ли одновременно замокапить и класс, и интерфейс?

Дисклеймер: я понимаю, что есть обходные решения данной задачи, но интересует именно наиболее нативный способ реализации.

У нас есть интерфейс, который мы хотим отлавливать через try catch. Реальных классов, реализующих этот интерфейс, еще не существует, мы делаем этот отлов только на случай, если библиотека, в которой этот интерфейс реализуется, получит новые классы исключений с этим интерфейсом. В коде, который работает вокруг этого try catch, у данного исключения используется метод getMessage().

Соответственно, нам нужно получить мок интерфейса, у которого будет метод getMessage(). Просто взять и указать данный метод через setMethods() невозможно - PHPUnit проверит, есть ли такой метод в интерфейсе, и выдаст ошибку. И в итоге нам нужно получить мод интерфейса с дополнительным методом.

Вопрос: мы можем взять реально существующий класс Exception, указать неким образом, что он должен реализовывать наш интерфейс, и получить такой мок? Или нативными средствами PHPUnit данная задача не решается?
  • Вопрос задан
  • 157 просмотров
Решения вопроса 2
@vldud
Вроде бы не решается.

С моей точки зрения, ваша задумка не очень логична. Вот реализуете классы, тогда и пишите тесты конкретно под них.
Ответ написан
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
Не надо плодить классы. Воспользуйтесь тогда анонимным классом (для таких задач их и придумали) прямо в коде:
new class implement YourInterface {
    // тут методы, которые интерфейс содержит
    // тут методы, которые вы будете вызывать
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы