首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mockito -模拟正在测试的异步方法内部的方法

在使用 Mockito 进行单元测试时,有时需要模拟异步方法内部调用的其他方法。为了实现这一点,你可以使用 Mockito 的 whenthenReturn 方法来定义模拟行为。以下是一个详细的示例,展示如何模拟异步方法内部的方法调用。

示例场景

假设你有一个服务类 MyService,其中包含一个异步方法 performAsyncOperation,该方法内部调用了另一个方法 internalMethod。你希望在测试中模拟 internalMethod 的行为。

代码语言:javascript
复制
public class MyService {
    public CompletableFuture<String> performAsyncOperation() {
        return CompletableFuture.supplyAsync(() -> internalMethod());
    }

    public String internalMethod() {
        // 复杂的逻辑
        return "Real Result";
    }
}

测试类

在测试类中,你可以使用 Mockito 来模拟 internalMethod 的行为。以下是一个完整的测试示例:

代码语言:javascript
复制
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

public class MyServiceTest {

    @Mock
    private MyService myService;

    @InjectMocks
    private MyService myServiceUnderTest;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void testPerformAsyncOperation() throws ExecutionException, InterruptedException {
        // 模拟 internalMethod 的行为
        when(myService.internalMethod()).thenReturn("Mocked Result");

        // 调用异步方法
        CompletableFuture<String> future = myServiceUnderTest.performAsyncOperation();

        // 等待异步操作完成并获取结果
        String result = future.get();

        // 验证结果
        assertEquals("Mocked Result", result);

        // 验证 internalMethod 被调用
        verify(myService).internalMethod();
    }
}

解释

  1. 注解和初始化
    • @Mock:用于创建一个模拟对象。
    • @InjectMocks:用于创建一个实例,并将标记为 @Mock 的字段注入到该实例中。
    • MockitoAnnotations.openMocks(this):初始化 Mockito 注解。
  2. 模拟行为
    • 使用 when(myService.internalMethod()).thenReturn("Mocked Result") 来定义 internalMethod 的模拟行为。
  3. 调用异步方法
    • 调用 myServiceUnderTest.performAsyncOperation() 来执行异步操作。
  4. 等待和获取结果
    • 使用 future.get() 来等待异步操作完成并获取结果。
  5. 验证结果和方法调用
    • 使用 assertEquals 来验证结果是否符合预期。
    • 使用 verify(myService).internalMethod() 来验证 internalMethod 是否被调用。

注意事项

  • 线程安全:确保在多线程环境中使用 Mockito 时,模拟对象是线程安全的。
  • 异步操作的超时:在实际测试中,可能需要设置超时来避免无限等待异步操作完成。
  • 依赖注入:确保正确地注入依赖项,以便在测试中能够模拟和验证内部方法的行为。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

共27个视频
【git】最新版git全套教程#从零玩转Git 学习猿地
学习猿地
本套教程内容丰富、详实,囊括:Git安装过程、本地库基本操作、远程基本操作、基于分支的Gitflow工作流、跨团队协作的 Forking工作流、开发工具中的Git版本控制以及Git对开发工具特定文件忽略的配置方法。还通过展示Git内部版本管理机制,让你了解 到Git高效操作的底层逻辑。教程的最后完整演示了Gitlab服务器的搭建过程。
共14个视频
CODING 公开课训练营
学习中心
本训练营包含 7 大模块,具体为敏捷与瀑布项目管理、代码管理、测试管理、制品管理、持续部署与应用管理。从 DevOps 全链路上每个模块的业界理念和方法论入手,以知其然并知其所以然为设计理念,并结合 CODING 平台的工具实操教学,给出规范示例,不仅能帮助学习者掌握 DevOps 的理论知识,更能掌握 CODING 平台各产品模块的正确使用方式,并进行扩展性的实践。
领券