Spring Boot 的单元测试

75 阅读2分钟

单元测试

1. 什么是单元测试

  单元测试是软件开发中的一种测试方法,用于验证程序中的最小功能单元(通常是方法)是否按照预期工作。

  它的目的是在开发过程中尽早发现和修复代码中的错误,并确保每个单独的功能单元在被集成到整个系统之前都能正常运行。

它的优点:

  1. 提高代码质量和可靠性。
  2. 自动化测试,提高测试效率和准确性。
  3. 提供文档和示例,方便他人理解和使用功能单元。
  4. 支持代码重构和维护,保证修改不会引入新的错误。
  5. 促进团队合作和知识共享。
  6. 改善代码设计,提高模块化和低耦合性。
  7. 可以不污染连接的数据库,也就是可以不对数据库进行任何改变的情况下,测试功能。

2. Spring Boot 的单元测试

  在创建 Spring Boot 项目的时候会自动添加 spring-boot-test 测试框架:

image.png

  如果没有的话,也可以手动添加:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

2.1 步骤

  假设我们有一个名为"UserService"的服务类,负责用户相关的操作。它依赖一个名为"UserMapper"的接口来访问数据库,并提供一些业务逻辑方法。

@Service
public class UserService {
    @Autowired 
    private UserMapper userMapper;
    
    //通过 id 来获取 数据
    public UserEntity getUserById(Integer id){
        return userMapper.getUserById(id);
    }
}

  现在对etUserById方法进行单元测试:

image.png

image.png

image.png

生成的初级状态:

@SpringBootTest
class UserServiceTest {

    @Test
    void getUserById() {
    }
}

补全代码(把getUserById当作main方法写)

@SpringBootTest
class UserServiceTest {

    @Autowired
    UserService userService;
    @Test
    void getUserById() {
        UserEntity user = userService.getUserById(1);
        //打印
        System.out.println(user);
    }
}

运行后就会打印结果(我这里已经配置好MySQL环境了)。

image.png

  可以使用断言方法:

下面是一些断言方法的汇总:

断言方法描述
assertEquals(expected, actual)验证两个值是否相等
assertNotEquals(expected, actual)验证两个值是否不相等
assertTrue(condition)验证条件是否为真
assertFalse(condition)验证条件是否为假
assertNull(actual)验证值是否为 null
assertNotNull(actual)验证值是否不为 null
assertSame(expected, actual)验证两个对象引用是否相同
assertNotSame(expected, actual)验证两个对象引用是否不相同
assertArrayEquals(expected, actual)验证两个数组是否相等
assertThrows(exceptionClass, executable)验证指定操作是否引发了特定类型的异常
fail()强制测试失败
@SpringBootTest
class UserServiceTest {

    @Autowired
    UserService userService;
    @Test
    void getUserById() {
        UserEntity user = userService.getUserById(1);
        //打印
        System.out.println(user);
        //使用断言:判断 user 是否 不为 null  不为 null 的时候才通过
        Assertions.assertNotNull(user);
    }
}