Estou fazendo testes de unidade e, em uma das minhas classes, preciso enviar um email de um dos métodos, portanto, usando injeção de construtor, injeto uma instância da Zend_Mailclasse que está no framework Zend.
Agora, algumas pessoas argumentam que, se uma biblioteca é estável o suficiente e não muda frequentemente, não há necessidade de envolvê-la. Supondo que Zend_Mailseja estável e não mude e atenda totalmente às minhas necessidades, não precisarei de um invólucro.
Agora dê uma olhada na minha turma Loggerque depende Zend_Mail:
class Logger{
private $mailer;
function __construct(Zend_Mail $mail){
$this->mail=$mail;
}
function toBeTestedFunction(){
//Some code
$this->mail->setTo('some value');
$this->mail->setSubject('some value');
$this->mail->setBody('some value');
$this->mail->send();
//Some
}
}
No entanto, o teste de unidade exige que eu teste um componente de cada vez; portanto, preciso zombar da Zend_Mailclasse. Além disso, estou violando o princípio da Inversão da Dependência, pois minha Loggerclasse agora depende da concreção e não da abstração.
Agora, como posso testar Loggerisoladamente sem quebrar Zend_Mail?!
O código está em PHP, mas as respostas não precisam ser. Isso é mais um problema de design do que um recurso específico do idioma