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

JUnit5测试@MockBean失效:无法Mock DAO/Service,调用实际方法

问题解决:@MockBean未生效,调用真实DAO方法

核心问题分析

你当前的测试配置存在两个冲突点,导致MockBean没有替换真实的DAO实例:

  • @SpringBootTest本身已经集成了Mockito的自动支持,额外添加@ExtendWith(MockitoExtension.class)会触发双重初始化,干扰Spring上下文对MockBean的替换逻辑。
  • @SpringBootTest(classes = {UserService.class})仅指定了UserService,可能导致Spring无法正确识别ReadDao的Bean定义,进而无法完成Mock替换。

两种可行的修复方案

方案1:纯Spring Boot测试模式(保留Spring上下文)

移除多余的@ExtendWith(MockitoExtension.class),确保ReadDao被Spring管理(比如添加@Repository注解),让@MockBean正常替换真实Bean:

修改后的测试类:

@SpringBootTest
@ImportAutoConfiguration(RefreshAutoConfiguration.class)
public class UserServiceTest {

    @Autowired
    UserService service;

    @MockBean
    private ReadDao readDao;

    @Test
    public void getDataTest() {
        User mockUser = new User(1,"john");
        // 匹配UserService中调用的固定参数"name"
        when(readDao.getData(eq("name"))).thenReturn(mockUser);

        User user = service.getUserData();
        // 可添加断言验证结果:assertNotNull(user);
    }
}

同时确保ReadDao类添加Spring注解:

@Repository
public class ReadDao {
    // DAO实现代码
}

方案2:纯Mockito测试模式(无Spring上下文,更轻量)

如果不需要Spring上下文(比如不需要处理@Value属性),可以完全脱离Spring,用纯Mockito注入:

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @InjectMocks
    private UserService service;

    @Mock
    private ReadDao readDao;

    // 手动注入@Value属性
    @BeforeEach
    void setUp() {
        ReflectionTestUtils.setField(service, "role", "Admin");
    }

    @Test
    public void getDataTest() {
        User mockUser = new User(1,"john");
        when(readDao.getData(eq("name"))).thenReturn(mockUser);

        User user = service.getUserData();
        assertNotNull(user);
        assertEquals("john", user.getName());
    }
}

Controller测试的同理修复

对于Controller测试,使用@WebMvcTest配合@MockBean即可,无需额外添加MockitoExtension:

@WebMvcTest(UserController.class)
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserService userService;

    @Test
    public void testGetUser() throws Exception {
        User mockUser = new User(1,"john");
        when(userService.getUserData()).thenReturn(mockUser);

        mockMvc.perform(get("/user"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name").value("john"));
    }
}

额外注意点

  • 原测试代码中readDao.getData的返回值类型与UserService接收的类型不匹配(返回Map但接收User),需修正Mock的返回值逻辑。
  • 所有被Mock的类必须是Spring管理的Bean(标注@Component/@Repository/@Service等),否则@MockBean无法生效。

内容的提问来源于stack exchange,提问作者User23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:13:13