Конвертировать из научной нотации строки для плавания в C #

Как уже упоминалось в моем комментарии, Мокито на самом деле несовместим с интуицией; много раз метод, который был заглушен или проверен, является просто «последним вызываемым методом», главным образом потому, что синтаксис, подобный verify(foo).doA(), фактически вызывает doA, а не передачу рефлексивной ссылки на метод doA в Mockito. Это просто несовместимо с синтаксисом, который вызывает тот же макет в середине stubbing или проверки.

Я написал об этом раньше в отношении Matchers , которые имеют такая же проблема во время stubbing. Выпивая исходный код, вы можете увидеть ту же проблему с проверкой, по крайней мере, при вызове метода в том же макете.

Короче говоря, проверка на самом деле является трехфазным процессом:

  1. Вызов verify(mockedThing).
  2. Соединители вызовов, при необходимости, при необходимости. Не вызывайте какие-либо методы на mockedThing.
  3. Вызовите метод, который вы проверяете на 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 */);

28
задан odbasta 15 September 2008 в 16:52
поделиться

2 ответа

Double.Parse("1.234567E-06", System.Globalization.NumberStyles.Float);
54
ответ дан Will 15 September 2008 в 16:52
поделиться
  • 1
    Предупреждение/Примечание: доступ ct.WaitHandle выдает исключение, если базовый CancellationTokenSource расположен. Достаточно легкий обратиться с дополнительным методом.. ct.WaitForCancellation(timespan), который может сразу возвратиться, если доступ выдает исключение. Должен использоваться в сочетании с маркерными проверками отмены, как мог привести к введению в заблуждение ' никакой wait' времена. – user2864740 21 June 2019 в 16:58

Также рассмотрите использование

Double.TryParse("1.234567E-06", System.Globalization.NumberStyles.Float, out MyFloat);

, Это гарантирует, что MyFloat установлен оценить 0, если по любой причине преобразование не могло бы быть выполнено. Или Вы могли обернуть Double.Parse() пример в Try..Catch блок и установить MyFloat на значение своего выбора, когда исключение обнаруживается.

11
ответ дан Jaymie Thomas 15 September 2008 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: