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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:15:42