Сам JUnit не имеет инструментов для проверки того, является ли поток рекурсивным или итеративным, но он, безусловно, может проверить, что вызов возвращает правильные результаты.
Теперь также невозможно собрать трассировки стека из "более ранних" казней.
Я тоже не понимаю, чем тут могут помочь насмешки, но я могу что-то упустить, может быть, наши коллеги приведут пример для этого, однако я предлагаю следующий подход:
- Не требуется, чтобы метод был статическим, вместо этого требуется, чтобы методы были регулярными.
Тогда используйте следующий трюк:
Подготовьте следующий класс, но не предоставляйте его студентам (я предположил, что это для образовательных целей, так как вы говорили об экзаменах, извините, если я ошибаюсь), которые, как ожидается, будут внедрять «Сервис» "класс:
class MyServiceForChecks extends Service {
private List<StackTraceElement[]> invocationStackTraces = new ArrayList<>();
public boolean containsDigit(int n, int d) { // its not static anymore
StackTraceElement [] stackTrace = getStackTrace();
invocationStackTraces.add(stackTrace);
return super.containsDigit(n,d);
}
public List<StackTraceElement[]> getInvocationStackTraces () {
return this.invocationStackTraces;
}
}
В JUnit тестируйте класс MyServiceForChecks вместо класса Service.
После того, как метод containsDigits
завершит выполнение, вы можете вызвать метод getInvocationStackTraces
и проанализировать результат.
Если вы не можете создать класс MyServiceForChecks, вы можете сгенерировать его динамически с помощью библиотеки CGLIB.