Beim Unit-Testen von Funktionen einer Klasse mit privaten Funktionen, für die Online-Funktionen erforderlich sind. Wie würde man es testen?
Beispielsweise:
public class Foo
{
public int methodA()
{
int val = goOnlineToGetVal();
return val;
}
private int goOnlineToGetVal()
{
CloudService c = new CloudService();
int oval = c.getValueFromService();
return oval;
}
}
Wenn ich die Funktion testen würde: 'methodA ()', würde es versuchen, 'goOnlineToGetVal ()' zu verwenden, was wiederum versuchen würde, online zu gehen, wenn dieser Test ohne Funktionalität durchgeführt würde. Wie würde ich eine 100% ige Klassenabdeckung erreichen, ohne online zu gehen?
unit-testing
junit
Ben verrückt nach Euden
quelle
quelle
Antworten:
new CloudService()
Und da ist dein Problem.
Modernes OO-Design empfiehlt, diese Art von Abhängigkeit weiterzugeben und nicht direkt zu konstruieren. Dies kann in die Funktion selbst oder zur Konstruktionszeit an die Klasse übergeben werden. Es könnte auch von einem Inversion of Control-Container erfasst oder aggregiert werden, wenn diese Komplexität gerechtfertigt ist.
An diesem Punkt wird es ziemlich trivial, einen Schein- / Fälschungsdienst zu absolvieren, um Sie während des Testens mit Ihren "Online" -Daten zu versorgen. Besser noch: Ihre Software ist so flexibel, dass Sie sie schnell anpassen können, falls ein (Regierungs-?) Kunde hinzukommt und die Cloud nicht für ihre Werte nutzen möchte. Oder Sie möchten einen Cloud-Anbieter für einen anderen sichern. Oder...
quelle
Ich würde es so implementieren:
Die Schnittstelle
ICloudService
kann entweder mit einem Mock zum Testen oder mit dem "echten" Cloud-Service implementiert werden. Wenn die Instanziierungnew CloudService()
für jeden Aufruf einer Drittanbieter-API obligatorischgetValueFromService
ist oderCloudService
von einer Drittanbieter-API stammt, die nicht geändert werden kann, implementieren Sie einen Wrapper, leiten SieICloudService
die entsprechenden Aufrufe ab und führen Sie sie aus .quelle