Как уже упоминалось в моем комментарии, Мокито на самом деле несовместим с интуицией; много раз метод, который был заглушен или проверен, является просто «последним вызываемым методом», главным образом потому, что синтаксис, подобный verify(foo).doA()
, фактически вызывает doA
, а не передачу рефлексивной ссылки на метод doA
в Mockito. Это просто несовместимо с синтаксисом, который вызывает тот же макет в середине stubbing или проверки.
Я написал об этом раньше в отношении Matchers , которые имеют такая же проблема во время stubbing. Выпивая исходный код, вы можете увидеть ту же проблему с проверкой, по крайней мере, при вызове метода в том же макете.
Короче говоря, проверка на самом деле является трехфазным процессом:
verify(mockedThing)
. mockedThing
. mockedThing
, с фактическими значениями параметров, если вы не используете совпадения, а также фиктивные (игнорируемые) значения параметров, если вы используете матчи. Поскольку Mockito отслеживает стек меток в фоновом режиме, методы сопоставления могут возвращать 0
или null
без Mockito, считая, что это значения для проверки. Вызывает verify
фактически просто устанавливает флаг и возвращает тот же макет :
public T verify(T mock, VerificationMode mode) {
// [catch errors]
mockingProgress.verificationStarted(new MockAwareVerificationMode(mock, mode));
return mock;
}
Затем внутри обработчика, который обрабатывает все макетные вызовы , Mockito начинает проверку при первом вызове макета, который происходит после начала проверки:
public Object handle(Invocation invocation) throws Throwable {
// [detect doAnswer stubbing]
VerificationMode verificationMode = mockingProgress.pullVerificationMode();
// [check Matcher state]
// if verificationMode is not null then someone is doing verify()
if (verificationMode != null) {
// We need to check if verification was started on the correct mock
// - see VerifyingWithAnExtraCallToADifferentMockTest (bug 138)
if (((MockAwareVerificationMode) verificationMode).getMock() == invocation.getMock()) {
VerificationDataImpl data = createVerificationData(invocationContainerImpl, invocationMatcher);
verificationMode.verify(data);
return null;
} else {
// this means there is an invocation on a different mock. Re-adding verification mode
// - see VerifyingWithAnExtraCallToADifferentMockTest (bug 138)
mockingProgress.verificationStarted(verificationMode);
}
}
// [prepare invocation for stubbing]
}
Поэтому, если вы взаимодействуете с макетом только с получить значение параметра, Mockito собирается предположить, что вы на самом деле вызываете метод для проверки. Обратите внимание, что если вызов был немного другим, например verify(mockedThing).doB(eq(5), eq(mockedThing.doA()));
с дополнительным eq(5)
, вы получили бы другое сообщение об ошибке при использовании маркеров - особенно потому, что Mockito не просто думает, что вы проверяете doA
, но это вы как-то думаете, что doA
принимает аргумент.
Ваш код не работает:
// DOESN'T WORK
verify(mockedThing).doB(eq(mockedThing.doA()));
// BECAUSE IT BEHAVES THE SAME AS
verify(mockedThing).doA();
Но извлечение его действительно работает:
// WORKS, though it makes an extra call to doA
Value value = mockedThing.doA();
verify(mockedThing).doB(eq(value));
И это также работает и показывает, что происходит под обложками, но никогда не пишите это в реальном тесте:
// WORKS BUT DON'T EVER ACTUALLY DO THIS
Value value = mockedThing.doA();
verify(mockedThing);
eq(value);
mockedThing.doB(8675309 /* dummy value ignored because of matcher */);
Double.Parse("1.234567E-06", System.Globalization.NumberStyles.Float);
Также рассмотрите использование
Double.TryParse("1.234567E-06", System.Globalization.NumberStyles.Float, out MyFloat);
, Это гарантирует, что MyFloat
установлен оценить 0, если по любой причине преобразование не могло бы быть выполнено. Или Вы могли обернуть Double.Parse()
пример в Try..Catch
блок и установить MyFloat
на значение своего выбора, когда исключение обнаруживается.
ct.WaitHandle
выдает исключение, если базовый CancellationTokenSource расположен. Достаточно легкий обратиться с дополнительным методом..ct.WaitForCancellation(timespan)
, который может сразу возвратиться, если доступ выдает исключение. Должен использоваться в сочетании с маркерными проверками отмены, как мог привести к введению в заблуждение ' никакой wait' времена. – user2864740 21 June 2019 в 16:58