Junit + Mockito 单元测试

简介

公司开发流程正规化一定会对单元测试有要求,写单元测试不仅可以在测试的过程中对程序单元的逻辑进行验证。还可以屏蔽外界依赖划清程序与程序之间的职责边界。

1.1 单元测试的特点

  • 属于白盒测试
  • 配合断言使用(杜绝System.out)
  • 可重复执行
  • 不依赖环境
  • 不会对数据产生影响
  • 可以和其他第三方系统划清边界
  • Spring的上下文环境不是必须的
  • 一般都要配合mock类框架来实现

1.2 mock类框架使用场景

要进行测试的方法存在外部依赖(如db, nacos,redis,第三方外部系统等),为了能够专注于对该方法(单元)的逻辑进行测试,就希望能虚拟出外部依赖,避免外部依赖成为测试的阻塞项,一般都是测试service层即可。

1.3 常用mock类框架

Mockito

1.4 如何引入Mockito框架

如果是SpringBoot项目只需要在pom.xml 加入这一个坐标即可

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

点开spring-boot-starter-test包可见这个starter里面包含三个关键的依赖
在这里插入图片描述

1.5 Mockito常用方法及注解

在这里插入图片描述

1.6 mock对象与spy对象

方法打桩方法不打桩作用对象最佳实践
mock对象执行插桩逻辑返回mock对象的默认值类、接口被测试类或其依赖项
spy对象执行插桩逻辑调用真实方法类、接口被测试类

1.7 初始化mock/spy对象的方式

方法一方法二方法三
junit4@RunWith(MockitoJunitRunner.class) + @Mock等注解Mockito.mock(X.class)MockitoAnnotations.openMocks(this) + @Mock等注解
junit5@ExtendWith(MockitoExtension.class) + @Mock等注解Mockito.mock(X.class)MockitoAnnotations.openMocks(this) + @Mock等注解

1.8 方法插桩

指定调用某个方法时的行为(stubbing)达到相互隔离的目的

  • 返回指定值
  • void返回值方法插桩
  • 插桩的两种方式
    • when(obj.someMethod()).thenXxx(); // 其中obj可以是mock对象
    • doXxx().when(obj).someMethod(); // 其中obj可以是mock/spy对象
  • 抛异常
  • 多次插桩
  • thenAnswer
  • 执行真正的原始方法
  • verify的使用

1.9 @InjectMocks注解的使用

作用:若此注解声明的变量需要用到mock/spy对象,mockito会自动注入当前类里的mock或spy成员
原理:构造器注入、setter注入、字段反射注入

2.0 断言工具

  • hamcrest
  • assertj
  • junit4原生断言
  • junit5原生断言

2.1 mockito在springboot环境使用(不推荐)

生成的对象受spring管理,相当于自动替换对应类型bean的注入

@MockBean
类似@Mock
用于通过类型或名字替换spring容器中已经存在的bean,从而达到对这些bean进行mock的目的

@SpyBean
作用类似@Spy
用于通过类型或名字包装spring容器中已经存在的bean,当需要mock被测试类的某些方法是可以使用。

2.2 在IDEA中检查单元测试代码覆盖率

在这里插入图片描述
如果是红色的条状表示这些行的代码未被单元测试覆盖到
在这里插入图片描述
所以在写单元测试时为了保持较高的单元测试覆盖率,在写单元测试的时候需要考虑正例和反例多种情况,凡是在代码逻辑里面出现的多个逻辑分支都同样需要在单元测试用例中被考虑到,这样写出的单元测试不仅覆盖率高,而且代码质量也会很高。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot是一个用于构建Java应用程序的开源框架,它提供了一种简化了配置的方式来快速构建应用程序。JUnit是一个用于编写和运行单元测试的开源测试框架,而Mockito是一个用于创建和管理模拟对象的Java库。 下面是一个使用Spring Boot、JUnitMockito进行单元测试的示例: 假设我们有一个UserService类,它依赖于一个UserRepository接口来访问数据库并进行一些操作。我们想要对UserService的方法进行单元测试。 首先,我们需要创建一个测试类,命名为UserServiceTest。在测试类中,我们将使用JUnit的注解来标记测试方法,并使用Mockito来创建模拟对象。示例代码如下: ```java @RunWith(MockitoJUnitRunner.class) public class UserServiceTest { @InjectMocks private UserService userService; @Mock private UserRepository userRepository; @Test public void testGetUserById() { // 配置模拟对象的行为 User user = new User("1", "John"); when(userRepository.findById("1")).thenReturn(user); // 调用被测试的方法 User result = userService.getUserById("1"); // 验证结果 assertEquals("John", result.getName()); } } ``` 在上面的示例中,我们使用了@RunWith注解来指定使用MockitoJUnitRunner运行测试,这样就能自动创建和管理模拟对象。使用@InjectMocks注解将被测试的对象自动注入到测试类中,使用@Mock注解创建模拟对象。 在testGetUserById方法中,我们首先使用when方法配置userRepository模拟对象的行为,表示当传入参数为"1"时,返回一个指定的User对象。 然后,我们通过调用userService的getUserById方法来测试该方法的逻辑。最后,使用assertEquals断言来验证结果是否符合预期。 以上就是一个使用Spring Boot、JUnitMockito进行单元测试的示例。通过使用Mockito创建模拟对象,我们可以更容易地测试各个方法的逻辑,而不依赖于实际的数据库。这样可以提高测试效率并确保代码的质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值