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

为什么要单元测试?

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


添加 Pom 文件

<!--        单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

测试Service

 

 生成Service测试环境

@SpringBootTest
class FindUserByIdServiceImpTest {
    @Autowired
    private FindUserByIdService findUserByIdService;
    @Test
    void findUserById() {
        UserVO user = findUserByIdService.findUserById(130);
        System.out.println(user.getUsername()+user.getPhonenumber());
        System.out.println(user);
    }
}

测试代码

@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环境下是等价的。

测试结果 


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

@SpringBootTest
@RunWith(SpringRunner.class)
class AddUserServiceImpTest {
    @Autowired
    private AddUserService addUserService;
    @Autowired
    private FindUserByIdService findUserByIdService;

    @Test
    @Transactional
    @Rollback
    void addUser(){
        User user = new User();
        user.setUsername("小白");
        user.setUserid(234);
        user.setPassword("414");
        user.setPhonenumber("19196511719");
        addUserService.addUser(user.getUserid(),user.getUsername(),user.getPhonenumber(),user.getPassword(),777);
        System.out.println("+++++++++++++++");
        UserVO userById = findUserByIdService.findUserById(234);
        System.out.println(userById);
        System.out.println("+++++++++++++++");

    }

}

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


测试Controller

@SpringBootTest
class FindUserByIdControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private WebApplicationContext webApplicationContext;
    @Test
    void findUserById() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); //构建请求地址服务
        RequestBuilder request = get("http://localhost:8080/find?userid=150");
        try {
            String response = mockMvc.perform(request).andReturn().getResponse().getContentAsString();
            System.out.println(response);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

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


版权声明:本文为m0_46628950原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。