• 【单元测试】SpirngBoot测试Controller,Service,Dao


    为什么要单元测试?

    如果不单元测试,不知道具体功能代码模块是否正确,只能通过PostMan或者启动项目Http请求去测试功能,而且不能具体测试某个代码块的功能(比如单独测试 FindUserByID 这个功能模块),有单元测试之后程序员可以自己测试自己写的代码功能是否正确。


    添加 Pom 文件

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-testartifactId>
    4. <scope>testscope>
    5. dependency>

    测试Service

     

     生成Service测试环境

    1. @SpringBootTest
    2. class FindUserByIdServiceImpTest {
    3. @Autowired
    4. private FindUserByIdService findUserByIdService;
    5. @Test
    6. void findUserById() {
    7. UserVO user = findUserByIdService.findUserById(130);
    8. System.out.println(user.getUsername()+user.getPhonenumber());
    9. System.out.println(user);
    10. }
    11. }

    测试代码

    @SpringBootTest:测试类所需注解

    @Test:测试方法所需注解

    1. @RunWith的作用
    2. @RunWith:就是一个运行器
    3. @RunWith(SpringRunner.class):指让类运行在Spring的测试环境,以便测试开始时自动创建Spring应用上下文
    4. @RunWith(JUnit4.class) 指用JUnit4测试工具来运行测试。
    5. @RunWith(SpringJUnit4ClassRunner.class):综合了注释2和注释3,让测试类运行于Spring测试环境,并使用JUnit4测试工具来运行测试。
    6. @RunWith(Suite.class):一套测试集合(suite指一套,使用RunWith测试套件)
    7. 在Idea环境中,如果不添加额外选项,默认使用JUnit4测试工具来进行测试。因此,@RunWith(SpringRunner.class)和@RunWith(SpringJUnit4ClassRunner.class)在idea环境下是等价的。

    测试结果 


    还有一种情况,测试对数据库的写的操作

    1. @SpringBootTest
    2. @RunWith(SpringRunner.class)
    3. class AddUserServiceImpTest {
    4. @Autowired
    5. private AddUserService addUserService;
    6. @Autowired
    7. private FindUserByIdService findUserByIdService;
    8. @Test
    9. @Transactional
    10. @Rollback
    11. void addUser(){
    12. User user = new User();
    13. user.setUsername("小白");
    14. user.setUserid(234);
    15. user.setPassword("414");
    16. user.setPhonenumber("19196511719");
    17. addUserService.addUser(user.getUserid(),user.getUsername(),user.getPhonenumber(),user.getPassword(),777);
    18. System.out.println("+++++++++++++++");
    19. UserVO userById = findUserByIdService.findUserById(234);
    20. System.out.println(userById);
    21. System.out.println("+++++++++++++++");
    22. }
    23. }

    测试模块不能真的添加数据到数据库,但需要测试加入数据,所以需要 @Transactional @Rollback 注解完成对sql事务和回滚的操作


    测试Controller

    1. @SpringBootTest
    2. class FindUserByIdControllerTest {
    3. @Autowired
    4. private MockMvc mockMvc;
    5. @Autowired
    6. private WebApplicationContext webApplicationContext;
    7. @Test
    8. void findUserById() {
    9. mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); //构建请求地址服务
    10. RequestBuilder request = get("http://localhost:8080/find?userid=150");
    11. try {
    12. String response = mockMvc.perform(request).andReturn().getResponse().getContentAsString();
    13. System.out.println(response);
    14. }catch (Exception e){
    15. e.printStackTrace();
    16. }
    17. }
    18. }

    需要通过 MockMvc 和 WebApplicationContext 去搭建一个请求地址服务

  • 相关阅读:
    什么是 GPT-4 Vision
    leetcode-二叉搜索树与双向链表-89
    表面和光栅区域的通道配置
    GBase 8c 硬件检查异常修复
    Paragon NTFS15是什么?Mac外置硬盘读写必备工具
    分词器与词表
    设计模式之策略模式
    org.apache.hadoop.security.AccessControlException: Permission denied: user=root
    基于ResNet34的花朵分类
    后缀自动机(SAM)+广义后缀自动机(GSA)
  • 原文地址:https://blog.csdn.net/m0_46628950/article/details/127135472