问题描述:在最初只了解后台时,想要输出数据库的测试数据验证环境是否搭建成功。于是想到在启动时调用 service 或者 mapper ,但是发现无论是 @Autowired 还是 private final 静态声明,得到的都是 Null(是因为项目刚启动时还没有加载完上下文,是没取不到类的)。
解决办法:使用 JUint 测试。JUnit 测试是 Java 语言的回归测试框架,是一种白盒测试方法,主要是进行逻辑,需要程序员了解测试代码的逻辑和功能。
Spring Boot 在创建完成后,会在 test/java 目录下生成一个 ApplicationTests 测试类。
可以不需要写 Mapper 或 Service,而是通过 DataSource(数组源组件)和 JdbcTemplate(用于访问数据库的组件)进行数据库连接测试,具体代码参照如下。
package com.example.hellospringboot;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.SQLException;
@SpringBootTest
class HelloSpringbootApplicationTests {
// 数据源组件
@Autowired
DataSource dataSource;
// 用于访问数据库的组件
@Autowired
JdbcTemplate jdbcTemplate;
@Test
void contextLoads() throws SQLException {
System.out.println("默认数据源:" + dataSource.getClass());
System.out.println("数据库连接实例:" + dataSource.getConnection());
// 访问数据库
Integer i = jdbcTemplate.queryForObject("SELECT count(*) FROM `person`", Integer.class);
System.out.println("person 表中共有" + i + "条数据。");
}
}
也可以在测试类中调用 Mapper 或 Service 测试(因为测试类是在启动完成后才运行的,此时已经完成了上下文加载,所以它是可以取到类的)
package com.example.hellospringboot;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.sql.SQLException;
@SpringBootTest
class HelloSpringbootApplicationTests {
@Autowired
PersonService personService;
@Test
void testMybatis() {
Person person = new Person();
person.setId(2);
person.setName("Mary");
person.setSex("2");
person.setIdCardNum("222100199805214523");
System.out.println(personService.update(person));
}
}
当然这只是进行了曲线救国,解决了最初的想要测试的目的,但是并没有直接在启动类中调用 Service 和 Mapper,所以本篇文章未完待续……