Я предполагаю, что calculateExecutionStartTime
возвращает время, которое составляет два часа назад по сравнению со временем, когда вы вызываете метод, и это то, что вы хотите проверить. В своем первом предложении я также предполагаю, что вы можете изменить метод, чтобы он возвращал современный Instant
вместо устаревшего Date
. Поскольку вы можете использовать java.time, современный Java-интерфейс даты и времени, это сразу выглядело бы как простое улучшение.
Проблема в том, что вызов может занять несколько миллисекунд, даже несколько секунд, и мы не знаем, в какой момент времени во время вызова он читает часы. Таким образом, нет тестирования с использованием assertEquals
с ожидаемым временем. Вместо этого мы читаем часы до и после вызова. Тогда наш тест может полагаться на метод, считывающий часы в некоторый момент между нашими двумя вызовами. В большинстве случаев это позволит нам проверить возвращаемое время с небольшим запасом. Идея была уже представлена Даудом ибн Каримом в комментарии.
@Test
public void testCalculateExecutionStartTime() {
Instant timeBefore = Instant.now();
Instant executionStartTime = proxy.calculateExecutionStartTime(
properties.getMessageConfiguration().getExecutionStartTime());
Instant timeAfter = Instant.now();
Duration expectedTimeAgo = Duration.ofHours(2);
Assert.assertFalse(executionStartTime.isBefore(timeBefore.minus(expectedTimeAgo)));
Assert.assertFalse(executionStartTime.isAfter(timeAfter.minus(expectedTimeAgo)));
}
Обратите внимание на использование Instant.now()
для чтения часов. Вам не нужно ZonedDateTime
и ZoneOffset
.
Если вы не можете изменить тип возвращаемого значения calculateExecutionStartTime
, просто конвертируйте полученное из него Date
:
Instant executionStartTime = proxy.calculateExecutionStartTime(
properties.getMessageConfiguration().getExecutionStartTime())
.toInstant();
Все остальное точно так же, как и раньше.
В функциях JavaScript являются объектами первого класса. Когда вы определяете функцию, она является конструктором для этого функционального объекта. Другими словами:
var gmap = function() {
this.add = function() {
alert('add');
return this;
}
this.del = function() {
alert('delete');
return this;
}
if (this instanceof gmap) {
return this.gmap;
} else {
return new gmap();
}
}
var test = new gmap();
test.add().del();
Назначив
new gmap();переменной test, вы создали новый объект, который «наследует» все свойства и методы конструктора (класса) gmap (). Если вы запустите приведенный выше фрагмент, вы увидите предупреждение для «добавить» и «удалить».
В приведенных выше примерах «this» относится к объекту окна, если только вы не заключите функции в другую функцию или объект.
Поначалу мне трудно понять цепочку, по крайней мере, для меня, но как только я понял это, я понял, насколько мощным это может быть инструмент.
К сожалению, прямой ответ должен быть «нет». Даже если вы можете переопределить существующие методы (что вы, вероятно, можете во многих UA, но я подозреваю, что в IE это невозможно), вы все равно застряли бы с неприятными переименованиями:
HTMLElement.prototype.setAttribute = function(attr) {
HTMLElement.prototype.setAttribute(attr) //uh-oh;
}
Лучшее, что вы могли бы получить подальше использует другое имя:
HTMLElement.prototype.setAttr = function(attr) {
HTMLElement.prototype.setAttribute(attr);
return this;
}