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_Mail
classe 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_Mail
seja 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 Logger
que 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_Mail
classe. Além disso, estou violando o princípio da Inversão da Dependência, pois minha Logger
classe agora depende da concreção e não da abstração.
Agora, como posso testar Logger
isoladamente 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
Respostas:
Você sempre deseja agrupar tipos e métodos de terceiros atrás de uma interface. Isso pode ser entediante e doloroso. Às vezes, você pode escrever um gerador de código ou usar uma ferramenta para fazer isso.
Mas não fique tentado a usar os métodos ou tipos de biblioteca em todo o seu código. Para começar, você terá problemas para escrever testes de unidade. Em seguida, uma licença será alterada ou você desejará acessar uma plataforma não suportada por terceiros e descobrirá que esses tipos e dependências foram criados dentro e ao redor de todas as suas outras classes.
A capacidade de alterar rapidamente fornecedores de terceiros é uma enorme vantagem.
fonte