You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:06:25