Podczas testowania jednostkowego funkcji klasy, która ma funkcje prywatne wymagające funkcjonalności online. Jak można przejść do testowania?
Na przykład:
public class Foo
{
public int methodA()
{
int val = goOnlineToGetVal();
return val;
}
private int goOnlineToGetVal()
{
CloudService c = new CloudService();
int oval = c.getValueFromService();
return oval;
}
}
Gdybym miał przetestować funkcję: „methodA ()”, próbowałby użyć „goOnlineToGetVal ()”, która z kolei spróbowałaby przejść do trybu online, gdyby test został wykonany bez funkcjonalności. Jak przejść około 100% pokrycia klasy bez przechodzenia do trybu online?
unit-testing
junit
Ben Crazed Up Euden
źródło
źródło
Odpowiedzi:
new CloudService()
I jest twój problem.
Nowoczesny projekt OO zaleca przekazywanie tego rodzaju zależności, a nie konstruowanie ich bezpośrednio. Można to przekazać do samej funkcji lub do klasy w czasie budowy. Może być również przechwycony lub zagregowany przez kontener Inwersja Kontroli, jeśli taka złożoność jest uzasadniona.
W tym momencie przechodzenie przez fałszywą / fałszywą usługę, aby zapewnić ci swoje dane „online” podczas testowania, staje się dość trywialne. Co więcej, pozwala na to, aby twoje oprogramowanie było wystarczająco elastyczne, abyś mógł szybko się dostosować, gdyby pojawił się jakiś (rządowy?) Klient i nie chce używać chmury dla swoich wartości. Lub chcesz zrzucić jednego dostawcę chmury dla drugiego. Lub...
źródło
Zaimplementowałbym to w ten sposób:
Interfejs
ICloudService
można zaimplementować za pomocą próbnego narzędzia do testowania lub za pomocą „prawdziwej” usługi w chmurze. Jeśli tworzenie instancjinew CloudService()
jest obowiązkowe dla każdego wywołaniagetValueFromService
lubCloudService
pochodzi z interfejsu API innej firmy, którego nie można zmienić, zaimplementuj opakowanie, wywodzącICloudService
i wykonując odpowiednie połączenia.źródło