PowerMock,模拟一个静态方法,然后在所有其他静态上调用真正的方法 [英] PowerMock, mock a static method, THEN call real methods on all other statics
问题描述
我正在设置模拟类的静态方法.我必须在带有 @Before
注释的 JUnit 设置方法中执行此操作.
I'm setting up mocking a class' static methods. I have to do this in a @Before
-annotated JUnit setup method.
我的目标是设置类来调用真正的方法,除了那些我明确模拟的方法.
My goal is to setup the class to call real methods, except for those methods I explicitly mock.
基本上:
@Before
public void setupStaticUtil() {
PowerMockito.mockStatic(StaticUtilClass.class);
// mock out certain methods...
when(StaticUtilClass.someStaticMethod(anyString())).thenReturn(5);
// Now have all OTHER methods call the real implementation??? How do I do this?
}
我遇到的问题是,在 StaticUtilClass
中,方法 public static int someStaticMethod(String s)
不幸地抛出一个 RuntimeException
如果提供一个 null
值.
The problem I'm running into is that within StaticUtilClass
the method public static int someStaticMethod(String s)
unfortunately throws a RuntimeException
if supplied with a null
value.
所以我不能简单地走调用真实方法作为默认答案的明显路线,如下所示:
So I can't simply go the obvious route of calling real methods as the default answer as below:
@Before
public void setupStaticUtil() {
PowerMockito.mockStatic(StaticUtilClass.class, CALLS_REAL_METHODS); // Default to calling real static methods
// The below call to someStaticMethod() will throw a RuntimeException, as the arg is null!
// Even though I don't actually want to call the method, I just want to setup a mock result
when(StaticUtilClass.someStaticMethod(antString())).thenReturn(5);
}
我需要设置默认答案以在所有其他静态方法上调用真实方法之后我模拟了我对模拟感兴趣的方法的结果.
I need to set the default Answer to call real methods on all other static methods after I mock the results from the method I'm interested in mocking.
这可能吗?
推荐答案
你在找什么叫做partial mocking.
在 PowerMock 中,您可以使用 mockStaticPartial 方法.
In PowerMock you can use mockStaticPartial method.
在 PowerMockito 中,您可以使用存根,它只会存根定义的方法而其他保持不变:
In PowerMockito you can use stubbing, which will stub only the method defined and leave other unchanged:
PowerMockito.stub(PowerMockito.method(StaticUtilClass.class, "someStaticMethod")).toReturn(5);
也不要忘记
@PrepareForTest(StaticUtilClass.class)
这篇关于PowerMock,模拟一个静态方法,然后在所有其他静态上调用真正的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!