首页
学习
活动
专区
工具
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 时,模拟对象是线程安全的。
  • 异步操作的超时:在实际测试中,可能需要设置超时来避免无限等待异步操作完成。
  • 依赖注入:确保正确地注入依赖项,以便在测试中能够模拟和验证内部方法的行为。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券