为了形成对比, 先展示一下之前junit的测试类
MyTest
package com.limi.test;
import com.limi.config.SpringConfig;
import com.limi.dao.AccountDao;
import com.limi.dao.AccountDaoImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
@Test
public void test1(){
//1.加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取配置的对象, 参数1:bean的id值, 参数2: 类名.class
AccountDao accountDao = context.getBean("accountDaoImpl", AccountDaoImpl.class);
//3.使用对象
System.out.println("money="+accountDao.getMoneyById(1));
}
}
可以看到需要手动写代码加载配置类、获取实例对象, 很麻烦.
1.整合JUnit4
第一步 引入相关测试依赖
第二步 编写测试类
JTest4
package com.limi.test;
import com.limi.config.SpringConfig;
import com.limi.dao.AccountDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) //选择单元测试框架
@ContextConfiguration(classes = SpringConfig.class) //加载配置文件
public class JTest4 {
@Autowired
private AccountDao accountDao;
@Test
public void test(){
System.out.println("money="+accountDao.getMoneyById(1));
}
}
可以看到
(1)@ContextConfiguration(classes = SpringConfig.class) 代替了之前手动写代码
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
载入配置类
(2) @Autowired
private AccountDao accountDao;
代替了 AccountDao accountDao = context.getBean(“accountDaoImpl”, AccountDaoImpl.class);
方便了许多
小知识:ContextConfiguration的参数
//1.加载xml配置文件,classpath就是src目录
@ContextConfiguration(locations = "classpath:bean1.xml")
//2.加载配置类文件
@ContextConfiguration(classes = SpringConfig.class)
//3.加载多个配置文件
@ContextConfiguration(classes = {SpringConfig1.class, SpringConfig2.class, SpringConfig3.class})
//或
@ContextConfiguration(locations = {"classpath:bean1.xml", "classpath:bean2.xml", "classpath:bean3.xml"})
//4.不写参数, 则默认按照@ContextConfiguration()所标注在的类的类名寻找配置文件
@ContextConfiguration()
2.整合JUnit5
第一步 引入相关测试依赖
第二步 编写测试类
package com.limi.test;
import com.limi.config.SpringConfig;
import com.limi.dao.AccountDao;
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;
@ExtendWith(SpringExtension.class) //选择单元测试框架
@ContextConfiguration(classes = SpringConfig.class) //加载配置文件
public class JTest5 {
@Autowired
private AccountDao accountDao;
@Test
public void test(){
System.out.println("money="+accountDao.getMoneyById(1));
}
}
注意选择Junit5
小知识:可以使用一个复合注解替代上面两个注解完成整合
package com.limi.test;
import com.limi.config.SpringConfig;
import com.limi.dao.AccountDao;
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.test.context.junit.jupiter.SpringJUnitConfig;
@SpringJUnitConfig(classes = SpringConfig.class)
public class JTest5 {
@Autowired
private AccountDao accountDao;
@Test
public void test(){
System.out.println("money="+accountDao.getMoneyById(1));
}
}
效果一样
3.项目代码
数据库表t_account
项目结构
配置类SpringConfig
package com.limi.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
@Configuration //配置类, 代替xml配置文件
@ComponentScan(basePackages = "com.limi") //组件扫描
public class SpringConfig {
//创建数据库连接池
//@Bean注解写在方法上面, 用于将方法的返回值加入到IOC容器中
@Bean
public DruidDataSource getDruidDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/db_springtest");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
//创建 JdbcTemplate 对象, 参数dataSource会自动从IOC容器中寻找并注入
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
//到 ioc 容器中根据类型找到 dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入 dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
}
Account
package com.limi.entity;
public class Account {
private Integer id;
private String userName;
private Double money;
public Account(Integer id, String userName, Double money) {
this.id = id;
this.userName = userName;
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", userName='" + userName + '\'' +
", money=" + money +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
}
AccountDao
package com.limi.dao;
public interface AccountDao {
//根据id查询账户余额
double getMoneyById(Integer id);
}
AccountDaoImpl
package com.limi.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class AccountDaoImpl implements AccountDao{
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public double getMoneyById(Integer id) {
String sql = "select money from t_account where id = ?";
double money = jdbcTemplate.queryForObject(sql,Double.class, id);
return money;
}
}
测试类MyTest
package com.limi.test;
import com.limi.config.SpringConfig;
import com.limi.dao.AccountDao;
import com.limi.dao.AccountDaoImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
@Test
public void test1(){
//1.加载配置类
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.获取配置的对象, 参数1:bean的id值, 参数2: 类名.class
AccountDao accountDao = context.getBean("accountDaoImpl", AccountDaoImpl.class);
//3.使用对象
System.out.println("money="+accountDao.getMoneyById(1));
}
}
测试类JTest4
package com.limi.test;
import com.limi.config.SpringConfig;
import com.limi.dao.AccountDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) //选择单元测试框架
@ContextConfiguration(classes = SpringConfig.class) //加载配置文件
public class JTest4 {
@Autowired
private AccountDao accountDao;
@Test
public void test(){
System.out.println("money="+accountDao.getMoneyById(1));
}
}
测试类JTest5
package com.limi.test;
import com.limi.config.SpringConfig;
import com.limi.dao.AccountDao;
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.test.context.junit.jupiter.SpringJUnitConfig;
@SpringJUnitConfig(classes = SpringConfig.class)
public class JTest5 {
@Autowired
private AccountDao accountDao;
@Test
public void test(){
System.out.println("money="+accountDao.getMoneyById(1));
}
}