在使用 Mockito 进行单元测试时,有时需要模拟异步方法内部调用的其他方法。为了实现这一点,你可以使用 Mockito 的 when
和 thenReturn
方法来定义模拟行为。以下是一个详细的示例,展示如何模拟异步方法内部的方法调用。
假设你有一个服务类 MyService
,其中包含一个异步方法 performAsyncOperation
,该方法内部调用了另一个方法 internalMethod
。你希望在测试中模拟 internalMethod
的行为。
public class MyService {
public CompletableFuture<String> performAsyncOperation() {
return CompletableFuture.supplyAsync(() -> internalMethod());
}
public String internalMethod() {
// 复杂的逻辑
return "Real Result";
}
}
在测试类中,你可以使用 Mockito 来模拟 internalMethod
的行为。以下是一个完整的测试示例:
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();
}
}
@Mock
:用于创建一个模拟对象。@InjectMocks
:用于创建一个实例,并将标记为 @Mock
的字段注入到该实例中。MockitoAnnotations.openMocks(this)
:初始化 Mockito 注解。when(myService.internalMethod()).thenReturn("Mocked Result")
来定义 internalMethod
的模拟行为。myServiceUnderTest.performAsyncOperation()
来执行异步操作。future.get()
来等待异步操作完成并获取结果。assertEquals
来验证结果是否符合预期。verify(myService).internalMethod()
来验证 internalMethod
是否被调用。领取专属 10元无门槛券
手把手带您无忧上云