Mockito.invokeMethod: Могу ли я передать реализацию функционального интерфейса в качестве аргумента? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть частный метод, который я пытаюсь проверить с помощью powermock.Параметры метода - это функциональный интерфейс и объект.Согласно документам, Whitebox.invokeMethod принимает только объекты в качестве параметров.Есть ли какая-то хитрость, чтобы передать реализацию функционального интерфейса?

т.е.

Object[] arguments = new Object[]{WarehouseOrderFieldFormattingProcessor::process, warehouseOrderEntity};
Whitebox.invokeMethod(processor, "processEntity", arguments);

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

Редактировать:

Объявление метода, который я пытаюсь передать:

public WarehouseOrderProcessorResult process(WarehouseOrderEntity entity, Configuration config) throws Exception {...}

Объявление метода, который я пытаюсь вызвать:

private void processEntity(ProcessEntityFunc processLambda, WarehouseOrderEntity entity) throws Exception {...}

И функциональный интерфейс:

@FunctionalInterface
public interface ProcessEntityFunc {
    WarehouseOrderProcessorResult process(WarehouseOrderEntity entity, Configuration config) throws Exception; 
}

1 Ответ

0 голосов
/ 07 декабря 2018

Вы не правы относительно ссылок на методы и реализации функциональных интерфейсов, вы можете поместить лямбду в массив:

Object myObject = new Object();
Consumer<Object> consumer = (Object item) -> System.out.println("Hello world");
Object[] arguments = new Object[]{consumer, myObject};

РЕДАКТИРОВАТЬ:

Как вы пытаетесьчтобы вызвать нестатический метод, вы должны создать экземпляр WarehouseOrderFieldFormattingProcessor, затем присвоить ссылку на метод переменной с типом вашего функционального интерфейса ProcessEntityFunc и только затем передать его в массив:

WarehouseOrderFieldFormattingProcessor warehouseOrderFieldFormattingProcessor = new WarehouseOrderFieldFormattingProcessor();
ProcessEntityFunc testFunction = warehouseOrderFieldFormattingProcessor::process;
Object[] arguments = new Object[]{testFunction, warehouseOrderEntity};
Whitebox.invokeMethod(processor, "processEntity", arguments);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...