Java Mockito: как подготовить разные ответы - PullRequest
0 голосов
/ 20 июня 2019
int calledCnt = 0;
doAnswer(i -> {
    if (calledCnt == 0) {
        calledCnt += 1;
        throw new InternalServerErrorException("test");
    }
    return false;
}).when(myClass.someFunction(any()));

Я хочу заблокировать вызов, когда, если он был вызван, сначала выдается исключение, но любые последующие вызовы будут возвращать false;

вышеуказанный звонок жалуется "Variables used in lambda should be final or effectively final"

Ответы [ 2 ]

1 голос
/ 20 июня 2019

В зависимости от того, проверяете ли вы myClass или зависимость, я бы порекомендовал полностью или частично издеваться над myClass (то есть, по крайней мере, вызовом someFunction()). Используя then...() методы, вы можете указать серии элементов для возврата, например:

when(myMockedClass.someFunction(any()))
    .thenThrow(new InternalServerErrorException("test"))
    .thenReturn(false);

Первый вызов вызовет исключение, а второй вызов и все последующие вызовы вернут значение false.

1 голос
/ 20 июня 2019

Либо сделайте calledCnt чем-то изменяемым (например, int[] с одним элементом, либо AtomicInteger), либо объявите ответ как анонимный класс, чтобы вы могли добавить переменную-член:

doAnswer(new Answer<Boolean>() {
  int calledCnt = 0;

  @Object public Boolean answer(InvocationOnMock invocation) {
    if (calledCnt == 0) {
      calledCnt += 1;
      throw new InternalServerErrorException("test");
    }
    return false;
  }
}).when(...);

(На самом деле, это не обязательно должен быть анонимный класс, это может быть любой класс. Просто использовать анонимный класс просто, потому что он сохраняет все локализованным в том месте, где он будет использоваться.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...