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
相关产品推荐
相关产品推荐

