2024年3月31日发(作者:)

mockitothencallrealmethod用法

在 Mockito 中,`thenCallRealMethod(` 方法可以用于调用真实方

法。 当使用`when(.thenCallRealMethod(`时,Mockito 会跳过模拟方法

的调用并调用真实的方法。

使用 `thenCallRealMethod(` 方法的正确场景是当我们需要在一些

情况下对一些方法进行模拟,而其他情况下需要执行真正的方法逻辑。

以下是使用 `thenCallRealMethod(` 的几种用法:

#1.对于具有一些参数的方法:

当在方法被调用时需要传递特定的参数,并且需要执行实际的方法逻

辑时,`thenCallRealMethod(` 可以用于参数匹配。

示例代码如下:

```java

public class SampleClass

public String process(String input)

if (("mockito"))

return "Mockito";

} else

return "Other";

}

}

public void testProcessMetho

SampleClass sampleClass = ();

(s("mockito")).thenCallRealMet

hod(;

assertEquals("Mockito", s("mockito"));

assertEquals("Other", s("other"));

```

在上面的示例中,`thenCallRealMethod(` 方法只有在输入参数为

"mockito" 时才调用真实的 `process(` 方法,并且返回预期的结果。

#2.对于具有不同参数的方法:

当方法被调用时,根据传递的参数返回真实的方法结果。

示例代码如下:

```java

public class SampleClass

public int sum(int a, int b)

return a + b;

}

public void testSumMetho

SampleClass sampleClass = ();

(((,

(2))).thenCallRealMethod(;

(((,

(3))).thenReturn(10);

assertEquals(5, (3, 2)); // 调用实际的方法

assertEquals(10, (4, 3)); // 返回模拟的结果

assertEquals(10, (5, 3)); // 返回模拟的结果

```

在上面的示例中,`thenCallRealMethod(` 方法只有在参数 `b` 的

值为 2 时才调用真实的 `sum(` 方法,并返回预期的结果。

#3.对于继承的方法:

当类继承自一些类,并且需要对继承的方法进行部分模拟和部分实现

时,可以使用 `thenCallRealMethod(`。

示例代码如下:

```java

public abstract class ParentClass

public abstract String getName(;

public class ChildClass extends ParentClass

public String getNam

return "Child";

}

public void testGetNameMetho

ChildClass childClass = ();

RealMethod(.when(childClass).getName(;

assertEquals("Child", e(); // 调用真实方法

```

在上面的示例中,`thenCallRealMethod(` 方法用于调用继承的真实

方法,从而返回预期的结果。

需要注意的是,`thenCallRealMethod(` 方法只能用于 `spy` 对象,

不能用于 `mock` 对象。

总结:

Mockito 的 `thenCallRealMethod(` 方法可以用于跳过模拟方法的

调用并执行真实的方法逻辑。它可以用于具有特定参数、不同参数和继承

方法的情况。通过使用 `(` 方法,我们可以创建一个部分模

拟的对象,并使用 `thenCallRealMethod(` 方法来调用真实方法。