Ao testar unidades de funções de uma classe que possui funções particulares que exigem funcionalidade online. Como alguém iria testá-lo?
Por exemplo:
public class Foo
{
public int methodA()
{
int val = goOnlineToGetVal();
return val;
}
private int goOnlineToGetVal()
{
CloudService c = new CloudService();
int oval = c.getValueFromService();
return oval;
}
}
Se eu testasse a função: 'methodA ()', tentaria usar 'goOnlineToGetVal ()', que por sua vez tentaria ficar online, no entanto, se esse teste fosse feito sem funcionalidade. Como eu cobria cerca de 100% de cobertura da aula sem ficar on-line?
unit-testing
junit
Ben enlouqueceu Euden
fonte
fonte
Respostas:
new CloudService()
E aí está o seu problema.
O design moderno do OO recomenda que esse tipo de dependência seja passado em vez de construído diretamente. Isso pode ser passado para a própria função ou para a classe no momento da construção. Também pode ser capturado ou agregado por um contêiner de Inversão de controle, se esse tipo de complexidade for justificado.
Nesse ponto, torna-se bastante trivial passar em um serviço falso / falso para fornecer seus dados "online" durante o teste. Melhor ainda, ele permite que seu software seja suficientemente flexível, para que você possa se adaptar rapidamente caso algum cliente (governamental?) Apareça e não queira usar a nuvem para seus valores. Ou você deseja despejar um provedor de nuvem para outro. Ou...
fonte
Eu implementaria assim:
A interface
ICloudService
pode ser implementada com uma simulação para teste ou com o serviço de nuvem "real". Quando a instanciaçãonew CloudService()
é obrigatória para cada chamada degetValueFromService
, ouCloudService
é de uma API de terceiros que não pode ser alterada, implemente um wrapper, derivandoICloudService
e fazendo as chamadas apropriadas.fonte