Mockito.invokeMethod:我可以将功能接口的实现作为参数传递吗?

时间:2018-12-07 20:26:06

标签: java unit-testing mockito powermock

我有一个私有方法,正在尝试使用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 :(得分:2)

您对方法引用和功能接口的实现不正确,可以将lambda放入数组:

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

编辑:

在尝试调用非静态方法时,应创建WarehouseOrderFieldFormattingProcessor的实例,然后将方法引用分配给功能接口类型为ProcessEntityFunc的变量,然后将其传递给数组:< / p>

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