Почему getArgument () при использовании doAnswer в mockito 2 не выполняет явное приведение? - PullRequest
0 голосов
/ 25 января 2019

Итак, теперь я перехожу с Mockito 1. * на 2. * и не понимаю, почему возникает проблема с приведением при использовании getArgument () в doAnswer. Я имею в виду, когда я пытаюсь вызвать getArgument () в другом аргументе метода или я пытаюсь связать методы в извлеченном объекте. Вот код, который работал с mockito 1. *

 doAnswer(invocation -> {
            try (InputStream inputStream = invocation.getArgumentAt(0, SomeResource.class).getResource().getInputStream()) {
                IOUtils.copy(inputStream, invocation.getArgumentAt(1, OutputStream.class));
            }
        return null;
        }).when(mockedService).downloadFile(any(), any());

Изменение getArgumentAt () на getArgument () после перехода на 2. * не удалось, потому что метод "getResource ()" не может быть найден с типом. Также получение второго аргумента из вызова не работало из-за несовместимого типа.

doAnswer(invocation -> {
            try (InputStream inputStream = invocation.getArgument(0).getResource().getInputStream()) {
                IOUtils.copy(inputStream, invocation.getArgument(1));
            }
        return null;
        }).when(mockedService).downloadFile(any(), any());

Мне пришлось перейти к явному приведению во втором аргументе или явному сохранению в новую ссылку и то же самое для первого. Этот код работает:

doAnswer(invocation -> {
    final SomeResource input = invocation.getArgument(0);
    final OutputStream outputStream = invocation.getArgument(1);
    try (InputStream inputStream = input.getResource().getInputStream()) {
        IOUtils.copy(inputStream, outputStream);
    }
    return null;
}).when(mockedService).downloadFile(any(), any());

Не знаю почему.

1 Ответ

0 голосов
/ 27 января 2019

Метод getArgument является универсальным методом.Он имеет следующую подпись:

<T> T getArgument(int index)

См. javadoc .

Это было невозможно до Java 8, в котором добавлено Обобщенный вывод целевого типа и обычно класс возвращаемого типа использовался в качестве одного из параметров (как в вашем примере с использованием Mockito 1. *).

Таким образом, когда вы присваиваете результат переменной конкретного типа, приведение ненеобходимо, потому что это может быть выведено.Когда вы передаете значение IOUtils.copy(), оно не может вывести отдельный конкретный тип, потому что метод copy перегружен.Если вы передадите его методу, который не перегружен, он будет работать без явного приведения.

...