【bug日记】spring项目使用配置类和测试类操作数据库

最近学校课程要求使用spring操作数据库,时间有点久了,操作都不太熟悉了,遇到了很多坑,特此记录一下。

导入依赖

复制代码
<!-- Spring Framework -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.10.RELEASE</version> <!-- 请根据实际情况选择合适的版本 -->
</dependency>

<!-- Spring Test -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.3.10.RELEASE</version> <!-- 请根据实际情况选择合适的版本 -->
    <scope>test</scope>
</dependency>

<!-- JUnit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version> <!-- 请根据实际情况选择合适的版本 -->
    <scope>test</scope>
</dependency>

<!-- MySQL Connector/J -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version> <!-- 请根据实际情况选择合适的版本 -->
</dependency>

编写配置类

  1. 使用Configuration注解注明这是一个配置类
  2. @ComponentScan("com.javaweb"):用于告诉Spring在指定的包及其子包中,扫描组件(比如带有 @Component@Service@Repository@Controller 等注解的类),并将其注册为 Spring 管理的 Bean。
  3. @EnableTransactionManagement:用于启用注解驱动的事务管理
java 复制代码
@Configuration
@ComponentScan("com.javaweb")
@EnableTransactionManagement
public class DatabaseConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/javaweb-course");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

编写测试类

java 复制代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {DatabaseConfig.class})
public class MyTest {


    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testSelectCount(){
        Integer integer = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
        System.out.println("the count of user is " + integer);
    }
}
  1. @RunWith(SpringJUnit4ClassRunner.class):是JUnit框架中的注解,用于指定测试运行器。在这里,它告诉JUnit使用 Spring 提供的测试运行器来执行测试。

    在Spring应用程序中进行单元测试时,通常需要加载和配置 Spring 的应用上下文(ApplicationContext)。SpringJUnit4ClassRunner 是 Spring 提供的一个测试运行器,它负责在测试开始之前初始化 Spring 的上下文,以便你的测试类能够使用 Spring 托管的 bean。

    有以下几个作用:

    1.Spring 上下文初始化: 通过此注解,JUnit 将使用 SpringJUnit4ClassRunner 类来启动 Spring 的上下文,确保你的测试类能够访问应用程序中定义的 bean。

    1. 依赖注入:通过上下文初始化,你可以使用 `@Autowired` 或其他 Spring 的依赖注入机制,将 Spring 管理的 bean 注入到测试类中。

    2. 事务管理:SpringJUnit4ClassRunner 还提供了对事务的支持。默认情况下,它会在测试方法执行前开启事务,在测试方法执行后回滚事务,以确保测试方法不会修改数据库状态。

如果不使用该注解,则Spring就会出现空指针异常,即无法注入bean对象

2.**@ContextConfiguration(classes = {DatabaseConfig.class})**是 Spring Test 框架的注解,用于指定加载 Spring 配置的类。在这个特定的例子中,`DatabaseConfig.class` 是用于配置数据库相关的 Spring Bean 的配置类。

作用是告诉 Spring Test 在运行测试时加载哪个配置类来构建应用程序上下文(ApplicationContext)。在这里,DatabaseConfig.class包含了数据库相关的配置信息,例如数据源、`JdbcTemplate` 等。

解析这个注解的参数:

  • classes = {DatabaseConfig.class}: 指定配置类,即包含了数据库相关配置的类。

通过在测试中使用 @ContextConfiguration,可以确保在测试执行过程中创建了与实际运行应用程序时相同的应用程序上下文。这有助于确保测试环境与实际环境的一致性,特别是当涉及到数据库或其他外部依赖时。

如果不使用该注解,则会出现无法加载应用程序的上下文

相关推荐
u***32433 分钟前
Mysql官网下载Windows、Linux各个版本
linux·数据库·mysql
i***39584 分钟前
mysql之如何获知版本
数据库·mysql
Tzarevich13 分钟前
AIGC 时代,用自然语言操作 SQLite3 数据库
数据库·sqlite
r***013813 分钟前
MySQL最多能有多少连接
数据库·mysql
b***666118 分钟前
Spring Boot 整合 Apollo 配置中心实战
java·spring boot·后端
CoderYanger33 分钟前
递归、搜索与回溯-综合练习:27.黄金矿工
java·算法·leetcode·深度优先·1024程序员节
l***0635 分钟前
Redis--模糊查询--方法实例
数据库·redis·缓存
七烦44 分钟前
金仓KingbaseES数据库安装至Linux系统
数据库·mysql·kingbasees
r***R2891 小时前
MySQL的日期时间类型
数据库·mysql
vx_vxbs661 小时前
【SSM高校普法系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
android·java·python·mysql·小程序·php·idea