Я работаю над проектом, в котором внутренние вызовы класса обычны, но в результате получаются простые значения. Пример ( не реальный код ):
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 эффективно изменяется, и может быть проблематично синхронизировать тесты с реализацией. Это правда? Есть ли лучшая практика, чтобы избежать этого хаоса внутренних вызовов методов?
Обратите внимание, что речь идет о частях алгоритма, поэтому разбиение его на несколько классов может оказаться нежелательным решением.