单元测试是否需要测试findAll方法?如何mock关联的entity实体?
问题解答
问题1:findAll类方法的单元测试必要性
- 只要该方法包含业务逻辑(比如数据转换、按语言过滤、字段映射、排序、计算等,不是单纯透传调用Repository返回结果),就必须做单元测试。如果只是单纯透传Repository的返回值,也可以通过单元测试验证方法调用链路、参数传递的正确性。
- 测试时建议构造多条测试数据覆盖不同场景:比如符合当前语言筛选条件的数据、不符合条件的数据、边缘空值数据等,最后将返回的
List<LabelDTO>和预期结果逐字段比对,确保数据映射、过滤逻辑完全符合预期。
问题2:Mock对象getEntity返回null的解决方案
出现返回null的原因是:Mock对象的所有方法默认返回空值(对象类型返回null,基础类型返回对应默认值),你没有为LabelWithTranslatable的getEntity方法配置返回值,所以调用后自然返回null。
你可以按以下两种方式处理:
方案1:同时Mock Entity对象(适合Entity包含复杂逻辑的场景)
// Mock Label实体对象 Label mockLabel1 = mock(Label.class); // 给实体的getId方法打桩 when(mockLabel1.getId()).thenReturn(123L); // 给LabelWithTranslatable的getEntity方法打桩,返回上面Mock的实体 when(labelWithTranslatable1.getEntity()).thenReturn(mockLabel1);
方案2:直接使用真实的Entity实例(适合Entity是简单POJO的场景,代码更简洁)
// 直接实例化Label实体,设置对应属性 Label realLabel1 = new Label(); realLabel1.setId(123L); // 给LabelWithTranslatable的getEntity方法打桩,返回真实实体 when(labelWithTranslatable1.getEntity()).thenReturn(realLabel1);
两种方案都可以解决getEntity返回null的问题,简单POJO场景更推荐第二种,减少不必要的Mock代码。
内容的提问来源于stack exchange,提问作者user16979464
相关产品推荐
相关产品推荐

