gpt4 book ai didi

unit-testing - PowerMock:如何模拟类中具有相同名称的静态方法?

转载 作者:行者123 更新时间:2023-12-02 03:38:01 24 4
gpt4 key购买 nike

今天我正在研究一个具有两个静态方法的类,这些方法具有相同的名称,不同的参数类型。当我尝试模拟其中一种方法时,我遇到了这个问题。

这是要模拟的类:

//RequestUtil.java, I want to mock the second config method
public class RequestUtil {
public static void config(String request, List parameters){}
public static void config(HttpServletRequest request, List parameters){}
}

这是测试类:
//RequestUtilTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest(RequestUtil.class)
public class RequestUtilTest {
//this test will throw NullPointException
@Test
public void testConfig() throws Exception {
mockStatic(RequestUtil.class);
doNothing().when(RequestUtil.class, "config", any(HttpServletRequest.class), anyList());
}
}

运行这个测试,它会抛出异常:
java.lang.NullPointerException
at java.lang.Class.isAssignableFrom(Native Method)
at org.powermock.reflect.internal.WhiteboxImpl.checkIfParameterTypesAreSame(WhiteboxImpl.java:2432)
at org.powermock.reflect.internal.WhiteboxImpl.getMethods(WhiteboxImpl.java:1934)
at org.powermock.reflect.internal.WhiteboxImpl.getBestMethodCandidate(WhiteboxImpl.java:1025)
at org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:948)
at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882)
at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:859)
at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:466)
at org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.when(PowerMockitoStubberImpl.java:106)
...

此异常是由以下原因引起的:
doNothing().when(RequestUtil.class, "config", any(HttpServletRequest.class), anyList());

但是,如果我模拟第一个配置方法,这意味着,将此行替换为:
doNothing().when(RequestUtil.class, "config", anyString(), anyList());

一切都好。

RequestUtil 类定义中配置方法的顺序与此问题无关。无论 config(HttpServletRequest, List) 是 RequestUtil 的第一个还是第二个配置方法,config(HttpServletRequest, List) 的模拟都会失败。

此外,如果我将 HttpServletRequest 修改为另一个“更简单”的类型,例如 int,这个问题就会消失。

这似乎是 PowerMock 的一个错误,但我不确定。我搜索了谷歌和stackoverflow,但没有关于这个问题的帖子或讨论。所以有人可以帮助我吗?

我使用的测试框架:
JUnit: 4.10
PowerMock: 1.5.4
Mockito: 1.9.5

最佳答案

这似乎是一个 PowerMock 错误,带有 overloaded methods .

您可以通过使用 WhiteBox class 查找方法对象来绕过它。 ,并显式地 mock 此方法。

...
import org.powermock.reflect.Whitebox;

//RequestUtilTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest(RequestUtil.class)
public class RequestUtilTest {
//this test will throw NullPointException
@Test
public void testConfig() throws Exception {
mockStatic(RequestUtil.class);
Method method = Whitebox.getMethod(RequestUtil.class, "config", HttpServletRequest.class, List.class);
doNothing().when(RequestUtil.class, method);
}
}

A similar question之前在stackoverflow上被问过。

关于unit-testing - PowerMock:如何模拟类中具有相同名称的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22059689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com