Pracuję nad projektem, w którym połączenia wewnętrzne klasy są zwykle, ale wyniki są wielokrotnie proste. Przykład ( nie prawdziwy kod ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Pisanie testów jednostkowych dla tego typu kodu jest naprawdę trudne, ponieważ chcę tylko przetestować system warunków, a nie implementację rzeczywistych warunków. (Robię to w osobnych testach.) W rzeczywistości byłoby lepiej, gdybym zdał funkcje, które implementują warunki, a w testach po prostu podałem jakiś próbny. Problemem w tym podejściu jest hałas: często używamy leków generycznych .
Działające rozwiązanie; ma jednak na celu uczynienie testowanego obiektu szpiegiem i wykpienie wywołań funkcji wewnętrznych.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
Problem polega na tym, że implementacja SUT została skutecznie zmieniona i utrzymywanie synchronizacji testów z implementacją może być problematyczne. Czy to prawda? Czy istnieje najlepsza praktyka pozwalająca uniknąć spustoszenia wywołań metod wewnętrznych?
Zauważ, że mówimy o częściach algorytmu, więc podział go na kilka klas może nie być pożądaną decyzją.