Я працюю над проектом, де внутрішні дзвінки класу звичайні, але результати багато разів прості. Приклад ( не реальний код ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Писати одиничні тести для цього типу коду дуже важко, оскільки я просто хочу перевірити систему умов, а не реалізацію реальних умов. (Я роблю це в окремих тестах.) Насправді було б краще, якби я передав функції, що реалізують умови, а в тестах я просто надаю макет. Проблема такого підходу - галасливість: ми багато використовуємо дженерики .
Робоче рішення; однак, це зробити тестований об'єкт шпигуном та знущатися над дзвінками до внутрішніх функцій.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
Стурбованість тут полягає в тому, що реалізація SUT ефективно змінюється, і може бути проблематично тримати тести в синхронізації з реалізацією. Це правда? Чи є найкраща практика уникати цієї загрози внутрішніх викликів методів?
Зауважте, що ми говоримо про частини алгоритму, тому розбиття його на кілька класів може бути не бажаним рішенням.