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

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

相关推荐
阿华的代码王国4 分钟前
【Android】CheckBox实现和监听
android·xml·java
Honesty8610245 分钟前
深入排查:@Scope(“prototype“)与@RequestScope字段篡改问题全链路分析
java·spring boot·spring·原型模式
速易达网络8 分钟前
MyUI按钮VcButton 组件文档
java·服务器·前端
Honesty86102410 分钟前
Spring 作用域冲突深度解析:@Scope(“prototype“)与@RequestScope的冲突与解决方案
java·spring·原型模式
满分观察网友z18 分钟前
MySQL 分页的“灵异事件”:为什么我的排序总是不对劲?
数据库
你不是我我26 分钟前
【Java开发日记】我们来说说 LockSupport 的 park 和 unpark
java·开发语言
达文汐26 分钟前
【中等】题解力扣21:合并两个有序链表
java·算法·leetcode·链表
时空无限36 分钟前
ubuntu 22.04 pam 模块设置用户登录失败锁定
linux·数据库·ubuntu
今天背单词了吗98036 分钟前
算法学习笔记:27.堆排序(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·程序人生·算法·堆排序·节日
言之。39 分钟前
Django `transaction.atomic()` 完整使用指南
数据库·python·django