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.