如何用JUnit/Mockito测试Java中的Lambda Function Bean?
测试Spring Lambda Function Bean的方法
针对你遇到的问题,这里提供两种直接测试该Lambda Bean的方案,无需转换为类:
方案1:通过Spring Boot Test加载上下文测试
这种方式适合需要完整Spring上下文支持的场景,能自动注入Bean并替换依赖的Mock:
@SpringBootTest(classes = {你的配置类.class}) class AudienceMapperTest { @Autowired private Function<Request, Audience> fromAudienceDTOToAudienceMapper; @MockBean private Function<ExpressionDto, Expression> fromExpressionDtoToExpression; @MockBean private Function<SchemaDto, Schema> fromSchemaDtoToSchema; @MockBean private Function<PolicyDTO, Policy> fromDataGovernancePolicyDtoToDataGovernancePolicy; @Test void testAudienceMapping() { // 构造测试请求 Request testRequest = new Request(); // 填充request中的DTO字段,比如testRequest.setExpressionDto(new ExpressionDto(...)) // Mock依赖函数的返回值 Expression mockExpr = new Expression(); when(fromExpressionDtoToExpression.apply(any(ExpressionDto.class))).thenReturn(mockExpr); // 同理mock另外两个依赖函数的返回结果 // 执行映射逻辑 Audience result = fromAudienceDTOToAudienceMapper.apply(testRequest); // 验证结果正确性 assertNotNull(result); // 可根据业务逻辑添加更多断言,比如assertEquals(result.getXXX(), 预期值) // 验证依赖函数是否被正确调用 verify(fromExpressionDtoToExpression).apply(any(ExpressionDto.class)); } }
方案2:直接调用配置类方法获取Function实例
如果不想加载Spring上下文,可直接实例化配置类,手动传入Mock的依赖函数:
class AudienceMapperTest { // Mock三个依赖函数 private final Function<ExpressionDto, Expression> mockExprMapper = Mockito.mock(Function.class); private final Function<SchemaDto, Schema> mockSchemaMapper = Mockito.mock(Function.class); private final Function<PolicyDTO, Policy> mockPolicyMapper = Mockito.mock(Function.class); @Test void testAudienceMapping() { // 实例化配置类,获取目标Function实例 你的配置类 config = new 你的配置类(); Function<Request, Audience> mapper = config.fromAudienceDTOToAudienceMapper(mockExprMapper, mockSchemaMapper, mockPolicyMapper); // 构造测试请求 Request testRequest = new Request(); // 填充测试数据 // Mock依赖函数返回值 when(mockExprMapper.apply(any(ExpressionDto.class))).thenReturn(new Expression()); // 其他依赖的Mock逻辑 // 执行映射并验证 Audience result = mapper.apply(testRequest); assertNotNull(result); verify(mockExprMapper).apply(any(ExpressionDto.class)); } }
注意点
你提到直接实例化时不执行原逻辑,大概率是因为没有调用配置类的fromAudienceDTOToAudienceMapper方法来获取真正的Lambda实例——这个方法的返回值才是包含业务映射逻辑的Function,而不是直接创建Function对象。
内容的提问来源于stack exchange,提问作者rishabh
相关产品推荐
相关产品推荐

