如何在JUnit 5测试中启用@Autowired注解并完成Repository测试
Spring + JUnit 5 测试WordRepository配置指南
一、问题描述
已实现WordRepository接口及实现类,首次尝试用JUnit 5测试验证功能,不清楚需添加哪些配置让测试正常运行。
二、核心代码
1. WordRepository接口
package com.similiz.dictionary.repository; import com.similiz.dictionary.entity.SameWords; import com.similiz.dictionary.entity.Word; import java.util.List; public interface WordRepository { List<Word> findAll(); Word findById(long id); List<Word> findSameWords(Word word); SameWords findSameWordsById(long id); <T extends Word> List<T> saveAll(Iterable<T> words); void save(Word word); void deleteAll(); void deleteById(long id); }
2. WordRepository实现类
package com.similiz.dictionary.repository; import com.similiz.dictionary.entity.SameWords; import com.similiz.dictionary.entity.Word; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.query.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import java.util.ArrayList; import java.util.List; @Repository public class WordRepositoryImplementation implements WordRepository { @Autowired private SessionFactory sessionFactory; @Override public List<Word> findAll() { Session session = sessionFactory.getCurrentSession(); Query<Word> wordQuery = session.createQuery("select w from Word w", Word.class); return wordQuery.getResultList(); } @Override public Word findById(long id) { Session session = sessionFactory.getCurrentSession(); return session.get(Word.class, id); } @Override public List<Word> findSameWords(Word word) { Session session = sessionFactory.getCurrentSession(); Query<Word> wordQuery = session .createQuery("select sw.word2 from SameWords sw where sw.word1.id = :id", Word.class) .setParameter("id", word.getId()); return wordQuery.getResultList(); } @Override public SameWords findSameWordsById(long id) { Session session = sessionFactory.getCurrentSession(); return session.get(SameWords.class, id); } @Override public <T extends Word> List<T> saveAll(Iterable<T> words) { Session session = sessionFactory.getCurrentSession(); List<T> wordsList = new ArrayList<>(); for (T word : words) { session.save(word); wordsList.add(word); } return wordsList; } @Override public void save(Word word) { Session session = sessionFactory.getCurrentSession(); session.saveOrUpdate(word); } @Override public void deleteAll() { Session session = sessionFactory.getCurrentSession(); session.createQuery("delete from Word").executeUpdate(); } @Override public void deleteById(long id) { Session session = sessionFactory.getCurrentSession(); session.createQuery("delete from Word w where w.id = :id") .setParameter("id", id).executeUpdate(); } }
3. 测试类代码
package com.similiz.dictionary.repository; import com.similiz.dictionary.entity.Word; import com.similiz.dictionary.util.ConnectionManager; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import static org.junit.jupiter.api.Assertions.assertSame; class WordRepositoryImplementationTest { @Autowired private WordRepository wordRepository; @Test void returnNullIfWordsTableIsEmpty() { String sql = "select * from dictionary.words"; try (Connection connection = ConnectionManager.open(); Statement statement = connection.createStatement()) { System.out.println(connection.getTransactionIsolation()); ResultSet resultSet = statement.executeQuery(sql); List<Word> wordList = new ArrayList<>(); while (resultSet.next()) { Word word = new Word(); word.setId(resultSet.getLong("id")); word.setName(resultSet.getString("name")); wordList.add(word); } List<Word> wordRepositoryFindAllMethodResult = wordRepository.findAll(); assertSame(wordRepositoryFindAllMethodResult, wordList); } catch (SQLException e) { throw new RuntimeException(e); } } }
4. pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.similiz.dictionary</groupId> <artifactId>WordsLibrary</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>WordsLibrary Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>https://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.0</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.22</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.11.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.22</version> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.9.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>2.0.1</version> </dependency> </dependencies> <build> <finalName>WordsLibrary</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.1.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
三、配置修改及测试优化
1. 完善JUnit 5依赖
当前仅引入junit-jupiter-api,需添加引擎依赖才能运行测试,同时升级Surefire插件适配JUnit 5:
<!-- 添加JUnit 5引擎依赖 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.9.0</version> <scope>test</scope> </dependency> <!-- 升级Surefire插件 --> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> </plugin>
2. 配置Spring测试上下文
修改测试类,启用Spring上下文支持,实现Bean注入和事务管理:
package com.similiz.dictionary.repository; import com.similiz.dictionary.entity.Word; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @ExtendWith(SpringExtension.class) @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) // 替换为你的Spring配置文件路径 @Transactional class WordRepositoryImplementationTest { @Autowired private WordRepository wordRepository; @Test void returnEmptyListIfWordsTableIsEmpty() { wordRepository.deleteAll(); List<Word> result = wordRepository.findAll(); assertEquals(0, result.size()); } }
@ExtendWith(SpringExtension.class):启用Spring对JUnit 5的支持@ContextConfiguration:指定Spring配置文件位置,确保扫描到Repository和SessionFactory配置@Transactional:测试在事务中运行,结束后自动回滚,避免污染数据库
3. 修正断言逻辑
原测试用assertSame判断对象引用相同,不符合业务预期,应改为assertEquals判断列表内容一致:
// 替换原assertSame语句 assertEquals(wordList.size(), wordRepositoryFindAllMethodResult.size()); assertEquals(wordList, wordRepositoryFindAllMethodResult);
4. 确保Spring配置正确
Spring配置文件需包含:
- 组件扫描:
<context:component-scan base-package="com.similiz.dictionary.repository"/> - Hibernate SessionFactory、数据源、实体扫描配置
- 事务注解驱动:
<tx:annotation-driven/>
内容的提问来源于stack exchange,提问作者Similization
相关产品推荐
相关产品推荐

