Lors du test unitaire des fonctions d'une classe qui a des fonctions privées qui nécessitent des fonctionnalités en ligne. Comment procéder pour le tester?
Par exemple:
public class Foo
{
public int methodA()
{
int val = goOnlineToGetVal();
return val;
}
private int goOnlineToGetVal()
{
CloudService c = new CloudService();
int oval = c.getValueFromService();
return oval;
}
}
Si je devais tester la fonction: 'methodA ()', il tenterait d'utiliser 'goOnlineToGetVal ()' qui, à son tour, essaierait de se connecter en ligne, si ce test était effectué sans fonctionnalité. Comment pourrais-je obtenir une couverture de classe à 100% sans aller en ligne?
unit-testing
junit
Ben Crazed Up Euden
la source
la source
Réponses:
new CloudService()
Et il y a votre problème.
La conception OO moderne recommande que ce type de dépendance soit transmis plutôt que construit directement. Cela peut être transmis à la fonction elle-même ou à la classe au moment de la construction. Il peut également être saisi ou agrégé par un conteneur d'inversion de contrôle si ce type de complexité est justifié.
À ce stade, il devient assez banal de passer un service simulé / faux pour vous fournir vos données "en ligne" pendant les tests. Mieux encore, il permet à votre logiciel d'être suffisamment flexible, de sorte que vous puissiez vous adapter rapidement si un client (gouvernemental?) Arrive et ne veut pas utiliser le cloud pour ses valeurs. Ou vous voulez vider un fournisseur de cloud pour un autre. Ou...
la source
Je voudrais l'implémenter comme ceci:
L'interface
ICloudService
peut être implémentée soit avec une maquette pour les tests, soit avec le "vrai" cloudservice. Lorsque l'instanciationnew CloudService()
est obligatoire pour chaque appel degetValueFromService
, ouCloudService
provient d'une API tierce qui ne peut pas être modifiée, implémentez un wrapper, dérivantICloudService
et effectuant les appels appropriés.la source