Estou trabalhando em um projeto em que chamadas internas de classe são comuns, mas os resultados são muitas vezes valores simples. Exemplo ( código não real ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Escrever testes de unidade para esse tipo de código é realmente difícil, pois só quero testar o sistema de condições e não a implementação das condições reais. (Eu faço isso em testes separados.) Na verdade, seria melhor se eu passasse em funções que implementam as condições e, em testes, eu simplesmente forneço alguns mock. O problema dessa abordagem é o barulho: usamos muito genéricos .
Uma solução de trabalho; no entanto, é tornar o objeto testado um espião e zombar das chamadas para as funções internas.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
A preocupação aqui é que a implementação do SUT seja efetivamente alterada e pode ser problemático manter os testes sincronizados com a implementação. Isso é verdade? Existe prática recomendada para evitar esse estrago de chamadas de método interno?
Observe que estamos falando de partes de um algoritmo; portanto, dividi-lo em várias classes pode não ser uma decisão desejada.
fonte
Se ambos
findError()
echeckFirstCondition()
etc. são métodos públicos da sua classe,findError()
é efetivamente uma fachada para a funcionalidade que já está disponível na mesma API. Não há nada errado com isso, mas isso significa que você deve escrever testes muito semelhantes aos testes já existentes. Essa duplicação simplesmente reflete a duplicação na sua interface pública. Isso não é motivo para tratar esse método de maneira diferente dos outros.fonte
Os testes de unidade devem testar o contrato; é a única coisa importante para eles. Testar qualquer coisa que não faça parte do contrato não é apenas uma perda de tempo, é uma fonte potencial de erro. Sempre que você vê um desenvolvedor alterando os testes quando altera um detalhe de implementação, os alarmes devem tocar; esse desenvolvedor pode estar (intencionalmente ou não) ocultando seus erros. O teste deliberado dos detalhes da implementação força esse mau hábito, aumentando a probabilidade de que os erros sejam mascarados.
As chamadas internas são um detalhe de implementação e só devem ser interessantes para medir o desempenho . O que geralmente não é o trabalho de testes de unidade.
fonte
a
contiver uma chamada para o métodob
na mesma classe, os testes dea
deverão incluir testes deb
. E não há como mudar isso, desde queb
não seja passado paraa
o parâmetro Mas, não vejo outra solução.b
faz parte da interface pública, deve ser testado de qualquer maneira. Caso contrário, não precisa ser testado. Se você o tornou público apenas porque queria testá-lo, cometeu um erro.Em primeiro lugar, estou me perguntando o que é difícil testar sobre a função de exemplo que você escreveu? Até onde posso ver, você pode simplesmente passar várias entradas e verificar se o valor booleano correto é retornado. o que estou perdendo?
Quanto aos espiões, o tipo de teste chamado "caixa branca" que usa espiões e zombarias exige muito mais trabalho para escrever, não apenas porque há muito mais código de teste para escrever, mas sempre que a implementação é executada alterado, você também deve alterar os testes (mesmo que a interface permaneça a mesma). E esse tipo de teste também é menos confiável que o teste de caixa preta, porque você precisa garantir que todo esse código de teste extra esteja correto e, embora possa confiar, os testes de unidade de caixa preta falharão se não corresponderem à interface , você não pode confiar nisso sobre o uso excessivo de zombarias de código, porque às vezes o teste nem testa muito código real - apenas zombarias. Se as zombarias estiverem incorretas, é provável que seus testes sejam bem-sucedidos, mas seu código ainda está quebrado.
Qualquer pessoa que tenha experiência com testes de caixa branca pode dizer que é um pé no saco escrever e manter. Juntamente com o fato de serem menos confiáveis, os testes em caixa branca são simplesmente muito inferiores na maioria dos casos.
fonte