Подтвердить что ты не робот

Перехватить объект при вызове метода с помощью Mockito

Я издеваюсь над классом с методом void, вроде

public class Mock {
    public void method(String string) {
        // doSomething
    }
}

Мне все равно, что этот метод делает, но я хотел бы получить отправленную String.

Эта строка фактически является объектом в формате JSON, а метод, который я тестирую, модифицирует этот объект в зависимости от первоначально отправленной строки (довольно случайный вариант).

method(String json) {
    Object obj = unparse(json);
    obj.setRandomValue(random);
    String parsed = parse(obj);
    Mock.method(parsed);
}

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

Лучше всего было бы перехватить json, проанализировать его и проверить объект.

4b9b3361

Ответ 1

Вы ищете ArgumentCaptor:

  Mock mock =  Mockito.mock(Mock.class);
  ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
  mock.method("input");
  Mockito.verify(mock).method(captor.capture());
  String actualValue = captor.getValue();

Ответ 2

Есть еще один способ сделать это, вот пример:

Mock mock =  Mockito.mock(Mock.class);
when(mock.method(any(String.class))).thenAnswer(new Answer<Void>() {

        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            String actualValue = invocation.getArgumentAt(0, String.class);
            Assert.assertEquals("input", actualValue);
            return null;
        }
    });
// Test your method 
mock.method("input");
Mockito.verify(mock, Mockito.times(1)).method("input");

Ответ 3

Просто уточняя ответ от @softarn, чтобы соответствовать примеру OP, Reference здесь

Mock mock =  Mockito.mock(Mock.class);
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
verify(mock).method(argument.capture());
assertEquals("{some pretty json string}", argument.getValue());