Mockito when函数实现方式

本文介绍了Mockito库中when函数的工作原理,通过注解和直接创建对象的方式使用Mockito。当调用when方法时,Mockito利用ThreadLocal记录最近的方法调用,以实现精确的模拟返回值。文章探讨了Mockito为何会mock错误的方法,并强调了按照推荐方式使用以避免混淆。
摘要由CSDN通过智能技术生成

平时写单测时,对于一些有限制或因当前环境无法访问的接口时,需要用到Mock来为目标接口添加自定义的实现,使其表现出我们希望表现的逻辑,从而不影响单元测试的实现。Mockito是常用的一个类库,使用也比较简单。使用分为注解的方式和直接创建对象的方式。

  1. 注解的方式
// 被注入的目标对象
@InjectMocks
private AimService aimService;
// 创建一个MockedService的一个mock对象
@Mock
private MockedService mockedService;
// 具体使用
{
    // 激活注解
    MockitoAnnotations.initMocks(this);
    // 设置mock对象的指定方法预期的返回结果
    Mockito.when(mockedService.getName).thenReturn("tiang");
}
  1. 直接创建对象
// 创建Mock对象
MockedService mockedService = Mockito.mock(MockedService.class);
// set方法
aimService.setMockedService(mockedService);
// 设置预期结果
Mockito.when(mockedService.getName).thenReturn("tiang");

注解

对于注解的实现方式,首先initMocks方法会扫描整个类中的所有字段,寻找带注解的字段。

// org.mockito.internal.configuration.InjectingAnnotationEngine#process
public void process(Class<?> clazz, Object testInstance) {
    // 为所有带@Mock注解的字段生成Mock对象
    processIndependentAnnotations(testInstance.getClass(), testInstance);
    // 为所有带@InjectMock注解的字段,注入需要的mock对象
    injectMocks(testInstance);
}

private void processIndependentAnnotations(final Class<?> clazz, final Object testInstance) {
        Class<?> classContext = clazz;
        while (classContext != Object.class) {
            //this will create @Mocks, @Captors, etc:
            delegate.process(classContext, testInstance);
            //this will create @Spies:
            spyAnnotationEngine.process(classContext, testInstance);

            classContext = classContext.getSuperclass();
    }
}

public void injectMocks(final Object testClassInstance) {
        Class<?> clazz = testClassInstance.getClass();
        Set<Field> mock
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mockito是一个流行的Java测试框架,用于编写单元测试和集成测试。它提供了简便的方式来创建和操作模拟对象,以模拟外部依赖,从而使测试变得更加可靠和可控。 在Android开发中,Mockito可以用于编写单元测试来模拟Android组件、外部库或网络请求等。使用Mockito,您可以创建虚拟的对象,并定义它们在测试中的行为,以便在不需要真实依赖的情况下进行测试。 以下是一个简单的示例,展示了如何使用Mockito在Android中进行单元测试: ```java // 导入Mockito库 import static org.mockito.Mockito.*; // 创建一个模拟对象 MyDependency mockDependency = mock(MyDependency.class); // 定义模拟对象的行为 when(mockDependency.doSomething()).thenReturn("Mocked result"); // 在被测试的类中使用模拟对象 MyClass myClass = new MyClass(mockDependency); String result = myClass.methodUnderTest(); // 验证模拟对象的方法是否被调用 verify(mockDependency).doSomething(); // 断言结果是否符合预期 assertEquals("Mocked result", result); ``` 在这个例子中,我们使用Mockito创建了一个名为`mockDependency`的模拟对象,并定义了它的行为。然后,在被测试的类`MyClass`中使用了这个模拟对象,并对其进行了验证和断言。 Mockito还提供了其他强大的功能,如参数匹配、回调函数、部分模拟等。您可以参考Mockito官方文档和示例代码,深入了解其更多用法和功能。 希望这个简单的介绍能够帮助您了解如何在Android开发中使用Mockito进行单元测试。如果您有更多问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值