我有一个私有方法,正在尝试使用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;
}
答案 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);