Очепятка тут: [code] Далее есть несколько способов начать процесс внедрения: 1. В методе setUp вызвать [code java]MockitoAnnotations.initMocks(this);
Обнаружил в PowerMock такую полезную возможность, как подавление исполнения кода. Пример:
Ой всё! Пилю свою статью))
Screamer, в первый раз я не так понял проблему, теперь яснее стало. С одним только Mockito такое сделать нельзя, но если использовать PowerMock, который умеет мокировать конструкторы, можно было бы сделать так:
Ниасилил. Допустим есть следующий код: [php] class Repository { private $pdo; public function __construct() { $this->pdo = new \PDO(/*args ...*/); /* some code ... */ } } [/php] Мне нужно сделать так, чтобы на место приватного св-ва $pdo встал мок, при этом экземпляр класса \PDO не был создан, но код в конструкторе, который идёт ниже, должен выполнится. В PHP такое нереально, насколько я знаю. Разве что runkit какой-нибудь попробовать. Могу ошибаться. В python я просто оборачиваю функцию декоратором mock.patch: @patch('package.pdo'), где package -- это пакет, в котором располагается тестируемый класс. Соответственно там заимпортирован pdo. Ну это так к слову.
Если создаётся mock с помощью метода mock или аннотации @Mock, то реальный конструктор объекта и не вызывается, он вызывается, если мокировать с помощью spy() или @Spy.
Freddy, а если нужно, чтобы экземпляр класса не создавался, т.к. например там тянется ещё куча зависимостей, создаётся подключение к БД и т.д.?
Naik, очевидно же.
Как в PHP и его тестовых фреймворках с этим обстоит, я не знаю, но Mockito может внедрить mock в обоих случаях. В примере, который прикреплён к статье, mock c типом Map<String, MessageHandler> внедряется прямо в приватное поле, так как конструктора и сеттера с подходящим типом в параметрах MessageService не имеет.
Screamer, второй лучше? Java Категории |