Eight.Java版 2025-06-03 16:12 采纳率: 62.5%
浏览 19

测试类Mock不生效

试了一下午了,为什么我每次第二个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));
    }

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-06-03 16:12
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    Mock测试类不生效的解决方案

    你遇到的问题可能是Mockito的注入顺序问题。@InjectMocks 注解用于注入Mock对象,但是Mockito并不是强制执行注入顺序的。因此,如果你在测试类中使用了多个Mock对象,可能会出现Mock对象之间的依赖关系导致某些Mock对象不被注入。

    解决方案:

    1. 使用 @Mock 注解来指定Mock对象的顺序。例如:
    @Mock
    private BkdPhoneClassificationService bkdPhoneClassificationService;
    
    @Mock
    private AnotherService anotherService;
    
    1. 使用 MockitoAnnotations.initMocks(this) 方法来初始化Mock对象。例如:
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
    
    1. 使用 Mockito.when 方法来指定Mock对象的行为。例如:
    when(bkdPhoneClassificationService.doSomething()).thenReturn("result");
    
    1. 使用 Mockito.verify 方法来验证Mock对象的调用。例如:
    verify(bkdPhoneClassificationService).doSomething();
    
    1. 检查Mock对象的依赖关系是否正确。如果Mock对象之间存在依赖关系,需要使用 Mockito.when 方法来指定依赖关系。

    如果你已经使用了上述方法,但是问题仍然存在,可以提供更多的代码信息,以便更好地帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月3日