Как установить различное поведение для одного метода в Mockito? [Дубликат]

Разница заключается в определении области. var привязан к ближайшему функциональному блоку, а let - к ближайшему блоку , содержащему блок , который может быть меньше функционального блока. Оба являются глобальными, если вне любого блока.

Кроме того, переменные, объявленные с помощью let, недоступны до того, как они будут объявлены в их закрывающем блоке. Как показано в демо, это вызовет исключение ReferenceError.

Демо :

var html = '';

write('#### global ####\n');
write('globalVar: ' + globalVar); //undefined, but visible

try {
  write('globalLet: ' + globalLet); //undefined, *not* visible
} catch (exception) {
  write('globalLet: exception');
}

write('\nset variables');

var globalVar = 'globalVar';
let globalLet = 'globalLet';

write('\nglobalVar: ' + globalVar);
write('globalLet: ' + globalLet);

function functionScoped() {
  write('\n#### function ####');
  write('\nfunctionVar: ' + functionVar); //undefined, but visible

  try {
    write('functionLet: ' + functionLet); //undefined, *not* visible
  } catch (exception) {
    write('functionLet: exception');
  }

  write('\nset variables');

  var functionVar = 'functionVar';
  let functionLet = 'functionLet';

  write('\nfunctionVar: ' + functionVar);
  write('functionLet: ' + functionLet);
}

function blockScoped() {
  write('\n#### block ####');
  write('\nblockVar: ' + blockVar); //undefined, but visible

  try {
    write('blockLet: ' + blockLet); //undefined, *not* visible
  } catch (exception) {
    write('blockLet: exception');
  }

  for (var blockVar = 'blockVar', blockIndex = 0; blockIndex < 1; blockIndex++) {
    write('\nblockVar: ' + blockVar); // visible here and whole function
  };

  for (let blockLet = 'blockLet', letIndex = 0; letIndex < 1; letIndex++) {
    write('blockLet: ' + blockLet); // visible only here
  };

  write('\nblockVar: ' + blockVar);

  try {
    write('blockLet: ' + blockLet); //undefined, *not* visible
  } catch (exception) {
    write('blockLet: exception');
  }
}

function write(line) {
  html += (line ? line : '') + '
'; } functionScoped(); blockScoped(); document.getElementById('results').innerHTML = html;

Глобальный:

Они очень похожи, если использовать это вне функционального блока.

let me = 'go';  // globally scoped
var i = 'able'; // globally scoped

Однако глобальные переменные, определенные с помощью let, не будут добавлены как свойства на глобальном объекте window, таком как те, которые определены с помощью var.

console.log(window.me); // undefined
console.log(window.i); // 'able'

Функция:

Они идентичны при использовании этого в функциональном блоке.

function ingWithinEstablishedParameters() {
    let terOfRecommendation = 'awesome worker!'; //function block scoped
    var sityCheerleading = 'go!'; //function block scoped
}

Блок:

Вот разница. let видна только в цикле for(), а var видна всей функции.

function allyIlliterate() {
    //tuce is *not* visible out here

    for( let tuce = 0; tuce < 5; tuce++ ) {
        //tuce is only visible in here (and in the for() parentheses)
        //and there is a separate tuce variable for each iteration of the loop
    }

    //tuce is *not* visible out here
}

function byE40() {
    //nish *is* visible out here

    for( var nish = 0; nish < 5; nish++ ) {
        //nish is visible to the whole function
    }

    //nish *is* visible out here
}

Обновление:

Предполагая строгий режим, var будет позвольте вам повторно объявить одну и ту же переменную в той же области. С другой стороны, let не будет:

'use strict';
let me = 'foo';
let me = 'bar'; // SyntaxError: Identifier 'me' has already been declared
'use strict';
var me = 'foo';
var me = 'bar'; // No problem, `me` is replaced.

0
задан djangofan 18 June 2015 в 17:47
поделиться

1 ответ

Пока вы делаете все ваши заглушки частью одной и той же цепочки , Mockito будет продолжать их последовательно, всегда повторяя окончательный вызов.

// returns false, false, true, true, true...
when(your.mockedCall(param))'
    .thenReturn(Boolean.FALSE, Boolean.FALSE, Boolean.TRUE);

Вы также можете сделать это с помощью этого синтаксиса ...

// returns false, false, true, true, true...
when(your.mockedCall(param))
    .thenReturn(Boolean.FALSE)
    .thenReturn(Boolean.FALSE)
    .thenReturn(Boolean.TRUE);

... что может пригодиться, если действия не являются всеми возвращаемыми значениями.

// returns false, false, true, then throws an exception
when(your.mockedCall(param))
    .thenReturn(Boolean.FALSE)
    .thenReturn(Boolean.FALSE)
    .thenReturn(Boolean.TRUE)
    .thenThrow(new Exception("Called too many times!"));

Если вы хотите, чтобы вещи стали более сложными, подумайте о том, чтобы написать Ответ .

2
ответ дан Jeff Bowman 1 September 2018 в 06:13
поделиться
Другие вопросы по тегам:

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