обратные вызовы mockito и получение значений аргументов - PullRequest
64 голосов
/ 09 июля 2011

Мне не повезло заставить Mockito захватывать значения аргументов функции!Я издеваюсь над индексом поисковой системы и вместо создания индекса я просто использую хеш.

// Fake index for solr
Hashmap<Integer,Document> fakeIndex;

// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);

// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))

Я не могу использовать произвольные аргументы, потому что я проверяю результаты запросов (то есть какиедокументы они возвращают).Кроме того, я не хочу указывать конкретное значение и иметь строку для каждого документа!

Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))

Я просматривал раздел обратных вызовов на странице Using Mockito .К сожалению, это не Java, и я не мог заставить свою собственную интерпретацию этого работать в Java.

РЕДАКТИРОВАТЬ (для пояснения): Как мне заставить Mockito захватить аргумент X и передать его вмоя функция?Я хочу, чтобы точное значение (или ref) X было передано в функцию.

Я не хочу перечислять все случаи, и произвольный аргумент не будет работать, потому что я проверяю разные результаты для разных запросов.

На странице Mockito написано:

val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString } 

Это не Java, и я не знаю, как перевести на Java или передать то, что произошло в функцию.

Ответы [ 4 ]

85 голосов
/ 09 июля 2011

Я никогда не использовал Mockito, но хочу учиться, так что здесь. Если кто-то менее невежественный, чем я, отвечает, попробуйте сначала ответить на него!

Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() {
 public Object answer(InvocationOnMock invocation) {
     Object[] args = invocation.getArguments();
     Object mock = invocation.getMock();
     return document(fakeIndex((int)(Integer)args[0]));
     }
 });
46 голосов
/ 16 июля 2011

Проверьте ArgumentCaptors:

http://site.mockito.org/mockito/docs/1.10.19/org/mockito/ArgumentCaptor.html

ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
Mockito.when(reader.document(argument.capture())).thenAnswer(
  new Answer() {
    Object answer(InvocationOnMock invocation) {
      return document(argument.getValue());
    }
  });
22 голосов
/ 28 октября 2016

Возможно, вы захотите использовать verify () в сочетании с ArgumentCaptor для обеспечения выполнения в тесте и ArgumentCaptor для оценки аргументов:

ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class);
verify(reader).document(argument.capture());
assertEquals(*expected value here*, argument.getValue());

Значение аргумента, очевидно, доступно через arguments.getValue() для дальнейших манипуляций / проверок или всего, что вы хотите сделать.

10 голосов
/ 15 октября 2016

В Java 8 это может выглядеть примерно так:

Mockito.when(reader.document(anyInt())).thenAnswer(
  (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));

Я предполагаю, что document это карта.

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