1、新建项目
原来的url:https://start.spring.io 换成https://start.aliyun.com
这样就可以选择springboot2.x的版本号了
2、代码以及配置文件
2.1. application.properties文件配置如下:
# 应用服务 WEB 访问端口
server.port=8080
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.test.demo.demos.model
#连接数据库
#allowMultiQueries=true 可以批量修改
#1)useAffectedRows=true时,update语句执行多次时,只有修改成功时才会返回1,若记录的值没有变化,返回0.
#2)useAffectedRows=false时,只要记录存在,无关记录是否发生变化,都会返回1。
#serverTimezone=Asia/Shanghai 时区 上海
#如果MySQL的版本为5.7以上时,必须加上useSSL=false,直接通过用户账号和密码进行连接MySQL数据库;
#当MySQL的版本是5.7以下则不进行要求,默认使用useSSL=false。
#useSSL=false:使用用户账号密码进行连接。
#useSSL=true:一般通过证书或者令牌进行安全验证。
#useUnicode=true&characterEncoding=utf8 指定字符的编码、解码格式
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#jdbc:mysql://数据库地址:端口号/数据库名称
spring.datasource.url= jdbc:mysql://localhost:3306/exam?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT&useAffectedRows=true&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=root
2.2. 实体类
@Data:是 Lombok 中的一个注解,可以自动生成以下代码:
- 所有字段的 get 和 set 方法。
- toString() 方法,用于将对象转换成字符串形式,便于日志输出和调试。
- hashCode() 方法,用于计算对象的哈希值。
- equals() 方法,用于判断两个对象是否相等。
- 会生成一个无参构造方法
@Data
public class User {
//主键
private String id;
//姓名
private String name;
//创建时间
private Date createTime;
//更新时间
private Date updateTime;
//状态
private int status;
}
2.3. 在Springboot启动类上面添加@MapperScan
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类
com.test.demo.demos.dao指向dao层
@SpringBootApplication
@MapperScan("com.test.demo.demos.dao")
public class TestDemoApplication {
public static void main(String[] args) {
SpringApplication.run(TestDemoApplication.class, args);
}
}
2.4. dao层代码,在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类
@Mapper
public interface UserDao {
//查询
public User getUserById(String id);
}
2.5. 创建MyBatis的映射文件(UserMapper.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">
<!-- namespace绑定dao层接口的全路径 -->
<mapper namespace="com.test.demo.demos.dao.UserDao">
<resultMap type="com.test.demo.demos.model.User" id="BaseResultMap">
<result property="id" jdbcType="VARCHAR" column="id"/>
<result property="name" jdbcType="VARCHAR" column="name"/>
<result property="createTime" jdbcType="TIMESTAMP" column="create_time"/>
<result property="updateTime" jdbcType="TIMESTAMP" column="update_time"/>
<result property="status" jdbcType="DECIMAL" column="status"/>
</resultMap>
<sql id="Base_Column_List">
id,
name,
create_time,
update_time,
status
</sql>
<!-- id="getUserById"对应UserDao里的方法getUserById -->
<select id="getUserById" resultMap="BaseResultMap" >
select
<include refid="Base_Column_List" />
from usertable
where id = #{id}
</select>
</mapper>
2.6. BIZ层代码
@Service
public class UserBiz {
@Autowired
private UserDao userDao;
public User getUserById(String id){
return userDao.getUserById(id);
}
}
2.7 service层代码
接口:
public interface UserService {
User getUserById(String id);
}
实现类:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserBiz userBiz;
@Override
public User getUserById(String id) {
return userBiz.getUserById(id);
}
}
2.8 controller层代码
SpringBoot开发常用注解说明_springboot get set 注解-CSDN博客
@RestController
@RequestMapping("/test")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("getUserById/{id}")
public User getUserById(@PathVariable("id") String id){
return userService.getUserById(id);
}
}
2.9 利用postman调用接口
其中/test/getUserById/5 对应controller里的@RequestMapper,id为5
2.10 单元测试
https://www.cnblogs.com/heyanfeng/p/18125441#mockito使用
超详细 springboot 整合 Mock 进行单元测试!本文带你搞清楚!_springboot mock-CSDN博客
controller层
单元测试之 - Spring框架提供的单元/集成测试注解_@autoconfiguremockmvc-CSDN博客
import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;
@AutoConfigureMockMvc
@SpringBootTest
public class UserControllerTest {
@MockBean
private UserService userService;
@Autowired
private MockMvc mockMvc;
@Test
public void getUserById() throws Exception {
String id="1";
User user=new User();
user.setId("1");
user.setName("ZhangSan");
Mockito.when(userService.getUserById(Mockito.any())).thenReturn(user);
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/test/getUserById/"+id)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
User newUser = JSON.parseObject(mvcResult.getResponse().getContentAsString(),User.class);
Assertions.assertThat(newUser).isEqualTo(user);
}
}
service层
@SpringBootTest
public class UserServiceImplTest {
@SpyBean
private UserServiceImpl userService;
@MockBean
private UserBiz userBiz;
@Test
public void getStockByGoodsId(){
User user=new User();
user.setId("1");
user.setName("张三");
// 设置调用方法userDao.getUserById后的预期结果为user
Mockito.when(userBiz.getUserById(Mockito.any())).thenReturn(user);
//调用
User newUser=userService.getUserById("1");
//断言返回的值newUser与期望返回值user是否相等
Assertions.assertThat(newUser).isEqualTo(user);
}
biz层
@SpringBootTest
public class UserBizTest {
// 被注入的目标对象
@InjectMocks
private UserBiz userBiz;
// 创建一个UserDao的一个mock对象
@Mock
private UserDao userDao;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void getUserById(){
User user=new User();
user.setId("1");
user.setName("张三");
// 设置调用方法userDao.getUserById后的预期结果为user
Mockito.when(userDao.getUserById(Mockito.any())).thenReturn(user);
//调用
User newUser=userBiz.getUserById("1");
//断言返回的值newUser与期望返回值user是否相等
Assertions.assertThat(newUser).isEqualTo(user);
}
}
3、整个项目目录以及运行查看单元测试
4、注意事项
(1)idea的右边没有maven框时点击view ->Tool Windows->maven
若该路径view ->Tool Windows->maven下找不到maven,则对pom.xml点击右键,选择add as maven
(2)@Test是import org.junit.jupiter.api.Test;
(3)单元测试的controller层里import com.alibaba.fastjson.JSON;时需要引入依赖到maven