1.springBoot整合Junit
- 搭建SpringBoot工程
- 引入starter-test起步依赖
- 编写测试类
- 添加测试相关注解
- @RunWith(SpringClass.classs)
- SpringBootTest(class = 启动类.class)
首先,创建好项目之后,springBoot默认帮我们引入了 starter-test
这个依赖,我们可以看一下 pom.xml
,里边已经引入了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
所以我们省去了这个步骤
因为单元测试我们大部分测试的业务中的代码,所以我们写一个service, 代码如下:
package com.example.javaspringboot.service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/person")
public class person {
@GetMapping("/getUser")
public void getUser () {
System.out.print("张三");
}
}
然后我们写一个单元测试,路径我们就在test/java下新建一个testPerson的类,代码如下:
package com.example.javaspringboot;
import com.example.javaspringboot.controller.HelloJava;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = JavaSpringBootApplication.class)
class JavaSpringBootApplicationTests {
@Autowired
private HelloJava helloJava;
@Test
void testHello() {
helloJava.hello();
}
}
package com.example.javaspringboot;
import com.example.javaspringboot.controller.HelloJava;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = JavaSpringBootApplication.class)
class JavaSpringBootApplicationTests {
@Autowired
private HelloJava helloJava;
@Test
void testHello() {
helloJava.hello();
}
}
然后启动一下这个类,我的项目在控制台包了个错,上边显示找不到RunWith这个注解,我从网上找了方法,原因是我们没有引入junit, 我们在maven的配置中引入一下这个包:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
然后刷新一下maven,可以看到代码的飘红消失了,在启动一下测试类,可以看到控制台打印了 张三
, 符合我们的预期;
如果测试类的包名和我们代码写的包名一样,我们可以不用指定引导类文件,也就是直接写 @SpringBootTest
2.springBoot整合Redis
- 搭建SpringBoot工程
- 引入redis起步依赖
- 配置redis相关属性
- 注入RedisTemplate模板
- 编写测试方法,测试
我们还是用之前的工程,在 pom.xml
中引入redis依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
然后刷新一下maven
然后在我们修改一下之前写的测试类,代码如下:
import com.example.javaspringboot.controller.HelloJava;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = JavaSpringBootApplication.class)
class JavaSpringBootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testSet() {
redisTemplate.boundValueOps("name").set("李四");
}
@Test
public void testGet () {
Object name = redisTemplate.boundValueOps("name").get();
System.out.print(name);
}
}
import com.example.javaspringboot.controller.HelloJava;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = JavaSpringBootApplication.class)
class JavaSpringBootApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testSet() {
redisTemplate.boundValueOps("name").set("李四");
}
@Test
public void testGet () {
Object name = redisTemplate.boundValueOps("name").get();
System.out.print(name);
}
}
可以看到我们写了两个方法,第一个是往redies
中存入一个值,第二个是获取这个值并打印
我们启动一下 redis
, 这个文件我存在了我的百度网盘下,关注我的微信公众号【凤凰城下的小码农】后,回复【软件】,里边有一个 【Redis-x64-3.2.100.zip】压缩文件, 解压之后运行【redis-server.exe】即可启动 redis
我们先不调用写入的方法,我们先调 testGet
这个方法,可以看到控制台中输出一个 null
,证明 redies
中还没有 name
这个 值,然后我们调用 testSet
这个方法,面板中上方有一个条,如果显示绿色,表示 redies
链接成功, 运行完成之后我们再调用 testGet
这个方法,可以看到控制台输出了 李四
, 证明我们测试通过
这个连接的是本地的 redies
, 如果是到线上呢,肯定是不能用本地的,我们可以再配置一下,在 application.yaml
中写入如下配置
server:
port: 8081
spring:
porfiles: dev
redis:
host: 127.0.0.1 # redis的主机
port: 6379 # redis的端口号, 默认就是6739, 也可以换成别的
3. springBoot整合MyBatis和Mysql
- 搭建springBoot工程
- 引入mybatis起步依赖, 添加mysql驱动
- 编写DataSource和MyBatis相关配置
- 定义表和实体类
- 编写dao和mapper文件/纯注解开发
- 测试
下面我们看一下实际代码中如何操作:
我们在项目工程的pom.xml文件中引入mybatis和mysql的依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
刷新一下maven,下载一下这些包
a.我们先看一下如何使用注解的方式
首先强调一下,用注解开发可以不用写mybatis配置信息,所以我们只需要配置一下mysql
在整合mysql之前,我们先启动一下mysql,关于如何启动,这里不过多介绍, 可以查看这篇文章 传送
我们在mysql中创建一个库,暂且叫他 test
, 新建一个表,叫 user
, 存一些用户的用户名 name
和密码 password
, 主键为 id
, 随便写几条数据, 这样准备工作就做好了
我们打开application.yaml文件配置一下
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///test?serverTimezone=UTC # 本地的可以用///表示
username: root
password: root
注意一定要写 serverTimezone=UTC
, 这个是配置时区的,时区对应不上会报错
然后我们写一个类,路径为 src/main/java/com/example/javaspringboot/domain
, 新建一个 User 类,添加用户名和密码的属性,并写getter和setter以及toString的方法,代码如下:
package com.example.javaspringboot.domain;
public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return name;
}
public void setUsername(String username) {
this.name = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + name + ''' +
", password='" + password + ''' +
'}';
}
}
package com.example.javaspringboot.domain;
public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return name;
}
public void setUsername(String username) {
this.name = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + name + ''' +
", password='" + password + ''' +
'}';
}
}
这里说一下如何快速创建getter和setter的方法,在文件中右键,选择【Gererate】, 选择【Getter and Getter】,勾选上对应的属性,点确定就ok了, toString方法一样
然后我们写一下对应的mapper, 目前我了解到mapper的作用是作为单独的一层,写一些数据库相关操作的映射,这样我们就不必再业务代码中写一堆查询
在 src/main/java/com/example/javaspringboot/mapper
路径下新建一个 UserMapper
的文件,注意创建是这个文件的类型不是 class
而是 interface
, 写如下代码:
package com.example.javaspringboot.mapper;
import com.example.javaspringboot.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface UserMapper {
@Select("select * from user")
public List<User> findAll();
}
package com.example.javaspringboot.mapper;
import com.example.javaspringboot.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface UserMapper {
@Select("select * from user")
public List<User> findAll();
}
至此,我们就把刚才在数据库中创建的那个user表里的数据都查出来了,我们写个单元测试验证一下
我们在单元测试的文件中添加如下代码:
@Autowired
private UserMapper userMapper;
@Test
public void testUser () {
List<User> list = userMapper.findAll();
System.out.print(list);
}
跑一下单元测试,可以看到控制台已经把数据库中的数据打印出来了!
b. 我们还可以使用xml的方式
我们还用domain文件夹下的 User类
然后我们在mapper文件夹下新建一个接口,叫做 UserXmlMapper, 里面写上如下代码,注意查询数据的方法我们没有写注解:
ackage com.example.javaspringboot.mapper;
import com.example.javaspringboot.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface UserXmlMapper {
public List<User> findAll();
}
然后我们写一个xml文件,里边有我们需要的sql语句,以及对应方法的映射,我们通常把这种配置文件放在resource
文件夹下,在这个 文件夹下新建一个mapper的文件夹,里边新建一个xml文件,叫UserMapper.xml, 注意xml文件是有约束头的,具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.javaspringboot.mapper.UserXmlMapper">
<select id="findAll" resultType="user">
select * from user
</select>
</mapper>
这里解释一下,namespace是我们刚才写的接口的全路径,表示当前xml和那个文件的映射,id就是对应方法名,resultType是别名,接下来我 们需要配置一下,使这个xml生效
在 application.yaml
文件中添加如下配置:
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml # mapper配置文件的路径,这里匹配所有以Mapper.xml结尾的文件
type-aliases-package: com.example.javaspringboot.domain # domain的全路径
# config-location: # 指定mybatis的核心配置文件
接下来我们测试一下我们写的代码是否能跑通
同样在我们的测试类中再添加一个方法:
@Autowired
private UserXmlMapper userXmlMapper;
@Test
public void testUser2 () {
List<User> list = userXmlMapper.findAll();
System.out.print(list);
System.out.print("测试通过");
}
可以从控制台看到我们打印的数据已经输出了
至此, springBoot整合其他框架的内容已经介绍完了。
文中所有的代码以及之后的代码已经上传到github和码云中,想要源码的同学关注我得vx公号【凤凰城下的小码农】后,回复【spring】即可获取。