У меня недавно была похожая проблема с кодом, который я не мог слишком много реорганизовать (ограничения по времени, не хотел непреднамеренно что-либо сломать). У него был метод, который я хотел проверить, который назывался System.currentTimeMillis (), и случай, который я хотел проверить, зависел от того, что вернуло это значение. Что-то вроде:
public class ClassINeedToTest {
public boolean doStuff() {
long l = System.currentTimeMillis();
// do some calculation based on l
// and return the calculation
}
}
Чтобы разрешить модульное тестирование, я провел рефакторинг класса, чтобы у него был вспомогательный метод, который был защищен
protected long getCurrentTimeMillis() {
// only for unit-testing purposes
return System.currentTimeMillis();
}
и этот метод был вызван doStuff (). Это не изменило функциональность, но теперь означало, что когда я вызываю его в модульном тесте, я могу переопределить это, чтобы вернуть определенное значение, например
ClassINeedToTest testClass = new ClassINeedToTest() {
protected long getCurrentTimeMillis() {
// return specific date for my test
return 12456778L;
}
};
boolean result = testClass.doStuff();
// test result with an assert here
Это, однако, означает, что я загрязнил интерфейс моего класса, так что вы можете решить, что цена слишком высока. Вероятно, есть лучшие способы, если вы можете реорганизовать код больше.