网络知识 娱乐 Spring Boot 单元测试(Controller测试与Service测试)

Spring Boot 单元测试(Controller测试与Service测试)

🎈博客主页:🌈我的主页🌈
🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏
🎈本文由 【泠青沼~】 原创,首发于 CSDN🚩🚩🚩
🎈由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!🌠个人主页


目录

  • 🌟 一、单元测试依赖解析
  • 🌟 二、单元测试注解分析
  • 🌟 三、Controller测试
    • 🌟🌟 3.1、测试实体类
    • 🌟🌟 3.2、测试Controller类
    • 🌟🌟 3.2、开启Controller单元测试
  • 🌟 四、Service测试
    • 🌟🌟 4.1、测试UserDao类
    • 🌟🌟 4.2、测试Service类
    • 🌟🌟 4.3、开启Service单元测试


🌟 一、单元测试依赖解析

在这里插入图片描述

🌟 二、单元测试注解分析

在这里插入图片描述

@SpringBootTest相当于springMvc中单元测试中的applicationContext,用于配置上下文环境

在这里插入图片描述

注解内部本身就十分重要的属性:
webEnvironment属性: 指定Web的应用环境

  • MOCK 指定的默认取值 提供一个模拟的Servlet环境(内置Servlet环境并没有启动) 并基于MOCKMvc来进行测试
  • RANDOM_PORT 提供随机的端口 提供一个真正的Servlet
  • DEFINE_PORT 提供默认端口 提供一个真正的Servlet
  • NONE 不提供Web环境
    (一般不用配置,SpringBoot自动配置好的)
    classes属性:指定应用的启动类
    (不需要配置,一般都是SpringBoot自动去寻找)

@Transactional注解:

应用于数据库应用中,涉及到数据库的操作,操作完成后会自动进行一个回滚,避免脏数据,如果使用RANDOM_PORT和DEFINE_PORT的Web应用环境,Http客户端服务器将在不同的线程中运行,分离事务,事务不会回滚

🌟 三、Controller测试

🌟🌟 3.1、测试实体类

public class User {
    private Long id;
    private String username;
    get和set方法省略
}

🌟🌟 3.2、测试Controller类

@RestController
public class UserController {

    @GetMapping("/hello/{id}")
    public User getUserByid(@PathVariable Long id){
        User user = new User();
        user.setUsername("dong");
        user.setId(id);
        return user;
    }
}

🌟🌟 3.2、开启Controller单元测试

在这里插入图片描述

进入到测试类中,注入web应用上下文webApplicationContext与mockMvc

 @Autowired
    WebApplicationContext webApplicationContext;
    MockMvc mockMvc;

初始化mockMvc(两种方式)

//初始化mockmvc
    @BeforeEach
    void setUp(){
        //自动去查找Controller
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
//初始化mockmvc
    @BeforeEach
    void setUp(){
        //自己指定要测试的Controller
        mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
    }

测试Controller

    @Test
    void contextLoads() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders
        		//访问的URL和参数
        		.get("/hello/99")
        		//允许的编码格式
        		.accept(MediaType.APPLICATION_JSON_UTF8))
        		//期望返回的状态码
                .andExpect(MockMvcResultMatchers.status().isOk())
                //编辑期望收到的JSON字符串
                .andExpect(MockMvcResultMatchers.content().string("{"id":99,"username":"dong"}"))
                //输出请求和响应结果
                .andDo(MockMvcResultHandlers.print());
    }

在这里插入图片描述
在这里插入图片描述

🌟 四、Service测试

🌟🌟 4.1、测试UserDao类

@Repository
public class UserDao {
    public User getUserById(long id){
        User user = new User();
        user.setId(id);
        user.setUsername("dong");
        return user;
    }
}

🌟🌟 4.2、测试Service类

@Service
public class UserService {
    @Autowired
    UserDao userDao;

    public User getUserById(long id){
        return userDao.getUserById(id);
    }
}

🌟🌟 4.3、开启Service单元测试

	//替换UserDao,不使用数据的Dao,使用测试的Dao
    @MockBean
    UserDao userDao;
    @Autowired
    UserService userService;
    @Test
    void Test1(){
        User user = new User();
        user.setUsername("123");
        user.setId(99L);
        //当调用userDao的getUserById方法传入参数99L,就返回一个对象
        Mockito.when(userDao.getUserById(99L)).thenReturn(user);

        User u = userService.getUserById(99L);
        //测试获得的对象与预期的对象是否一致
        Assertions.assertEquals(99L,u.getId());
        Assertions.assertEquals("123",u.getUsername());

    }

在这里插入图片描述