单元测试中使用Mockito模拟对象

本文介绍了如何使用Mockito进行单元测试,包括创建Mock对象、设定Mock对象的期望值行为及返回值、验证交互行为,以及在Service层单元测试中的实践。Mockito简化了对依赖对象的模拟,使得单元测试更加高效和可控。
摘要由CSDN通过智能技术生成

单元测试应该小巧玲珑,轻盈快捷。然而,一个待测的对象可能依赖另一个对象。它可能需要跟数据库、邮箱服务器、Web Service、消息队列等服务进行交互。但是,这些服务可能在测试过程中不可用。假设这些服务可用,依赖这些服务的单元测试可能相当耗时。要是

  1. Web Service 不可获得。
  2. 数据库因维护而关闭。
  3. 消息队列笨重且缓慢。

这些违背单元测试小巧玲珑,轻盈快捷的初衷。单元测试被期待在几毫秒内执行完成。若单元测试缓慢,你的开发过程受阻,这会影响你开发组的效率。解决之道就是模拟(Mocking),

若你遵循OOP的SOILD原则,且使用Spring的依赖注入,单元测试中的模拟Mock变得轻而易举。你不必连接数据库。你只需一个能返回你期待值的对象。若你编写紧密耦合代码,模拟会相当艰难。我目睹过许多因紧密耦合其它对象的遗留代码不能单元测试。不可测试代码不遵循OOP的SOILD原则,且不能使用依赖注入。

Mockito初体验

接下来将学习使用Mockito框架。它是一套通过简单的方法对于指定接口或类生产Mock对象的类库。使用Mockito,在准备阶段只需少量时间,可以使用简洁的API编写漂亮的测试,可以对具体类创建Mock对象,并且有监视非Mock对象的功能。

这有两个术语需要了解一下。

  • Stub对象作用是在测试时提供所需的测试数据,可以对各种交互设置相应的回应。Mockito中when(...).thenReturn(...)这样的语法便是设置方法调用的返回值。另外也可以设置方法在何时调用会抛异常等。

  • Mock对象用来验证测试中所依赖对象间的交互是否能够达到预期。Mockito中用verify(...).methodXxx(...)语法验证methodXxx()方法是否按照预期进行调用。

需要加入到pom.xml的依赖如下:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.16.0</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

创建Mock对象

可以通过两种方法来Mock对象

  1. 通过mock(Class<T> clazz)方法。
  2. 通过@Mock注解需要Mock的对象,然后调用MockitoAnnotations.initMocks(this)@RunWith(MockitoJUnitRunner.class)初始化模拟。
//@RunWith(MockitoJUnitRunner.class)
public class MockitoSampleTest {
   
    // 模拟接口
    UserService mockUserService = mock(UserService.class);
    // 模拟实现类
    UserServiceImpl mockServiceImpl = mock(UserServiceImpl.class);
    // 基于注释模拟类
    @Mock
    User mockUser;

    @Before
    public void initMocks() {
   
	    // 初始化当前测试类所有@Mock注释模拟对象
   		MockitoAnnotations.initMocks(this);
    }
}

值得注意的是,对于final类、匿名类和Java的基本类型是无法进行Mock的。

设定Mock对象的期望值行为及返回值

有两种通用基础设定写法:

  1. wh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值