如何Mock调用其他带参方法的方法?自定义参数测试method1
实现自定义参数调用的测试方案
假设你的method1定义在ClassA类中,method2属于另一个ClassB类,下面用Mockito框架实现测试时让method1调用method2传入自定义参数的需求:
1. 依赖准备
确保测试依赖中包含Mockito(以Maven为例):
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency>
2. 测试用例实现
方式一:拦截调用并替换参数(执行真实method2逻辑)
原method1中固定传入1和3作为method2的g、h参数,我们可以通过Spy对象拦截这个调用,替换为自定义参数后执行真实的method2逻辑:
import org.junit.Test; import org.mockito.Mockito; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; public class ClassATest { @Test public void testMethod1WithCustomParams() { // 初始化真实实例 ClassB realClassB = new ClassB(); ClassA classA = new ClassA(realClassB); // 假设ClassA通过构造注入ClassB // 创建ClassB的Spy对象,用于拦截方法调用 ClassB spyClassB = Mockito.spy(realClassB); // 替换ClassA中的ClassB实例为Spy对象 classA.setClassB(spyClassB); // 定义自定义的g、h参数 int customG = 5; int customH = 6; // 拦截method2的所有调用,替换参数后执行真实方法 doAnswer(invocation -> { // 获取原调用的a、b参数 int a = invocation.getArgument(0); int b = invocation.getArgument(1); // 用自定义参数调用真实的method2 return spyClassB.method2(a, b, customG, customH); }).when(spyClassB).method2(anyInt(), anyInt(), anyInt(), anyInt()); // 调用method1,这里c参数按实际逻辑传值即可 int result = classA.method1(2, 3, 0); // 验证结果:2+3+5+6=16 assertEquals(16, result); } }
方式二:Mock method2返回自定义结果(跳过真实逻辑)
如果不需要执行method2的真实逻辑,只是想模拟返回值,可以直接MockClassB:
import org.junit.Test; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ClassATest { @Mock private ClassB classB; private ClassA classA; @Test public void testMethod1WithMockedResult() { classA = new ClassA(classB); int a = 2; int b = 3; // 自定义参数对应的预期结果 int expectedResult = a + b + 5 + 6; // 当method2传入原固定参数1、3时,返回自定义参数计算的结果 when(classB.method2(a, b, 1, 3)).thenReturn(expectedResult); // 调用method1 int result = classA.method1(a, b, 0); assertEquals(expectedResult, result); } }
3. 注意事项
- 如果
method2是ClassA的内部方法,只需将Spy对象改为ClassA的实例,拦截逻辑保持一致。 doAnswer是实现参数替换的核心,它允许你在拦截方法调用时完全自定义参数和执行逻辑。
内容的提问来源于stack exchange,提问作者Ujjal Modak
相关产品推荐
相关产品推荐

