Spring v5整合JUnit v5测试时@Autowired注入UserDAO遇空指针问题
问题分析与解决
代码中的直接错误
手动覆盖Spring注入实例
在@BeforeEach方法里手动创建UserDAOImpl实例并赋值给userDao,这会完全覆盖Spring通过@Autowired注入的容器管理实例,导致后续使用的是未初始化(缺失数据源等依赖)的手动实例。必须删除这行代码:userDao = new UserDAOImpl();配置文件路径错误
@ContextConfiguration使用file:开头的路径在Maven测试环境下易出问题,因为测试类路径和主应用路径结构不同。改用类路径引用配置文件,修改为:@ContextConfiguration(locations = "classpath:WEB-INF/olap-servlet.xml")如果配置文件不在类路径,可将其移到
src/main/resources目录下,更便于测试加载。冗余的方法参数注入
测试方法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
相关产品推荐
相关产品推荐

