试了一下午了,为什么我每次第二个mock都不会调用,像是不生效一样?
@InjectMocks
private BkdPhoneClassificationService bkdPhoneClassificationService;
@Mock
private BkdPhoneNumberService bkdPhoneNumberService;
@Mock
private BkdPhoneClassificationMapper bkdPhoneClassificationMapper;
@Mock
private FileProcessService fileProcessService;
@Mock
private IDGeneratorUtil idGeneratorUtil;
@Mock
private Sm4Utils sm4Utils;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
// 手动设置 baseMapper
ReflectionTestUtils.setField(bkdPhoneClassificationService, "baseMapper", bkdPhoneClassificationMapper);
}
// =============== list 方法测试 ===============
@Test
void list_Success() {
// 1. 准备测试数据
PhonePageListVO vo = new PhonePageListVO();
vo.setPhoneType("0");
// 2. 准备模拟数据
List<PhoneClassificationEntity> mockEntities = Arrays.asList(
createPhoneClassificationEntity(1L, "0", "标题1", "zh_CN", 1),
createPhoneClassificationEntity(2L, "0", "标题2", "en_US", 2)
);
List<PhoneNumberEntity> mockNumbers = Arrays.asList(
createPhoneNumberEntity(1L, 1L, "13800138000"),
createPhoneNumberEntity(2L, 2L, "13900139000")
);
// 3. 设置Mock行为 - 确保两个mock都生效
// 第一个mock
when(bkdPhoneClassificationMapper.selectList(any(QueryWrapper.class))).thenReturn(mockEntities);
// 第二个mock - 更精确的匹配
when(bkdPhoneNumberService.list(any(QueryWrapper.class))).thenReturn(mockNumbers);
// 解密mock
when(sm4Utils.decryptDB(anyString())).thenAnswer(inv -> inv.getArgument(0));
// 4. 调用测试方法
List<PhoneClassificationDTO> result = bkdPhoneClassificationService.list(vo);
// 5. 验证结果
assertEquals(2, result.size());
// 验证电话号码映射
assertFalse(result.get(0).getPhoneNumberDTOS().isEmpty(), "第一个分类应有电话号码");
assertEquals("13800138000", result.get(0).getPhoneNumberDTOS().get(0).getPhoneOrEmail());
// 6. 验证mock调用
verify(bkdPhoneNumberService).list(any(QueryWrapper.class));
}