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

Spring v5整合JUnit v5测试时@Autowired注入UserDAO遇空指针问题

问题分析与解决

代码中的直接错误

  1. 手动覆盖Spring注入实例
    在@BeforeEach方法里手动创建UserDAOImpl实例并赋值给userDao,这会完全覆盖Spring通过@Autowired注入的容器管理实例,导致后续使用的是未初始化(缺失数据源等依赖)的手动实例。必须删除这行代码:

    userDao = new UserDAOImpl();
    
  2. 配置文件路径错误
    @ContextConfiguration使用file:开头的路径在Maven测试环境下易出问题,因为测试类路径和主应用路径结构不同。改用类路径引用配置文件,修改为:

    @ContextConfiguration(locations = "classpath:WEB-INF/olap-servlet.xml")
    

    如果配置文件不在类路径,可将其移到src/main/resources目录下,更便于测试加载。

  3. 冗余的方法参数注入
    测试方法testLoginUser无需再用@Autowired注入UserDAO参数,直接使用类级别注入的userDao即可,删除参数上的@Autowired:

    @Test
    public void testLoginUser() throws Exception {
        // ... 代码逻辑
        User loginUser = userDao.loginUser(user);
        assertNotNull(loginUser.getId());
    }
    

修复后的完整测试代码

@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "classpath:WEB-INF/olap-servlet.xml")
@ComponentScan(basePackages = {"ca.i5i.user"})
public class UserDAOTest {
    private User user;
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private UserDAO userDao;
    

    @BeforeEach
    public void setUp() throws Exception {
        user = new User();
    }
 
    @Test
    public void testLoginUser() throws Exception {
        user.setUserName("u743");
        user.setPassword("pass743");
        logger.info("testLoginUser info: UserName=" + user.getUserName() + ", Password = " + user.getPassword() + ";");
        logger.info("testLoginUser userDao=" + userDao);

        User loginUser = userDao.loginUser(user);
        assertNotNull(loginUser.getId());
    }
}

其他需要检查的点

  • 依赖配置:确保pom.xml中包含匹配版本的Spring Test与JUnit5依赖,示例如下:

    <!-- Spring Test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>
    <!-- JUnit 5 -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.9.2</version>
        <scope>test</scope>
    </dependency>
    

    注意spring-test版本要和Spring核心版本保持一致。

  • 组件扫描与DAO注解:确认UserDAOImpl类上标注了@Repository注解,且该类在ca.i5i.user包下,保证@ComponentScan能扫描到并加入Spring容器。

  • 数据源配置:检查olap-servlet.xml中的数据库地址、用户名、密码是否正确,测试环境下能否正常连接本地MySQL数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:35:44