首页 > 解决方案 > Mockito.invokeMethod:我可以将功能接口的实现作为参数传递吗?

问题描述

我有一个私有方法,我正在尝试使用 powermock 进行测试。方法参数是功能接口和对象。根据文档, Whitebox.invokeMethod 只接受对象作为参数。是否有某种技巧来传递功能接口的实现?

IE

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; 
}

标签: javaunit-testingmockitopowermock

解决方案


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

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);

推荐阅读