Spring+Mockito环境下如何Mock传入的Function函数式接口apply方法
问题解决方法
问题根因
- 若测试目标为
executeBehaviour方法:你代码中创建的Mock Function变量名为processFunction,但打桩时使用的变量是groupingFunction,两个变量指向不同对象,实际传入方法的Mock对象未配置打桩规则,因此无法返回预期值。 - 若测试目标为
processData方法:该方法内部硬编码了Lambda函数(check)->"hello"+check作为入参传给executeBehaviour,这个Lambda是方法局部变量,Mock框架无法直接拦截局部对象的方法调用,你在测试中创建的Mock Function并未进入processData的执行流程,因此返回的还是业务原生逻辑的hellocheck。
解决方案
场景1:测试executeBehaviour方法的逻辑正确性
只需对齐变量名,给实际传入的Mock Function配置打桩规则即可,示例代码如下:
@Test void testExecuteBehaviour() { Function<String, String> mockFunction = mock(Function.class); String testInput = "check"; String expectedResult = "check"; // 给实际传入的mockFunction配置打桩规则 when(mockFunction.apply(anyString())).thenReturn(expectedResult); String actualResult = itemInventoryProcessorService.executeBehaviour(mockFunction, testInput); Assertions.assertEquals(expectedResult, actualResult); // 可选:验证apply方法确实被调用,且入参符合预期 verify(mockFunction, times(1)).apply(testInput); }
场景2:测试processData方法,需要Mock内部传入的Function逻辑
需要先改造业务代码,将硬编码的Lambda提取为类的可注入依赖,避免在方法内部创建局部函数,改造后的业务代码如下:
public class ItemInventoryProcessorService { private final Function<String, String> dataProcessFunction; // 生产环境默认使用原有逻辑的无参构造 public ItemInventoryProcessorService() { this.dataProcessFunction = check -> "hello" + check; } // 测试场景使用的有参构造,支持注入自定义Function public ItemInventoryProcessorService(Function<String, String> dataProcessFunction) { this.dataProcessFunction = dataProcessFunction; } public String processData(){ String a = "check"; return executeBehaviour(dataProcessFunction, a); } public String executeBehaviour(Function<String,String> data, String data1){ //Some processing return data.apply(data1); } }
对应的测试代码如下:
@Test void testProcessData() { Function<String, String> mockFunction = mock(Function.class); String expectedResult = "check"; when(mockFunction.apply(anyString())).thenReturn(expectedResult); // 注入Mock Function创建测试用Service实例 ItemInventoryProcessorService testService = new ItemInventoryProcessorService(mockFunction); String actualResult = testService.processData(); Assertions.assertEquals(expectedResult, actualResult); // 可选:验证apply方法调用符合预期 verify(mockFunction, times(1)).apply("check"); }
内容的提问来源于stack exchange,提问作者Dharmvir Tiwari
相关产品推荐
相关产品推荐

