У меня была аналогичная проблема недавно с кодом, я не мог реорганизовать слишком много (временные ограничения, не хотел случайно покончить с чем-либо). У меня был метод, который я хотел проверить, который называется 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
Это однако означает, что я осквернила интерфейс моего класса, поэтому вы можете решить, что стоимость слишком высока. Есть, вероятно, лучшие способы, если вы можете реорганизовать код больше.
измените свой метод так, чтобы вы действительно дали время в качестве параметра, тогда вы можете проверить его, предоставив любое время, которое вы хотите. Что говорит об этом? – belgther
Можете ли вы рассказать, как вы получаете текущую дату и время? Может быть, насмешка будет работать ... –
На данный момент только с 'new Date()', может быть, мне нужен класс TimeProvider – Alex