如何用PowerMockito模拟抛出异常的重载无返回值公共静态方法
解决PowerMock模拟重载静态void方法时的TooManyMethodsFoundException问题
方法1:使用调用式语法指定目标重载方法
修改mock逻辑,先通过when指定目标类,再直接调用要mock的重载方法,PowerMock会根据调用时的参数类型匹配到对应的重载版本:
@RunWith(PowerMockRunner.class) @PrepareForTest(TheUtilsClass.class) public class MyTest { @Test public void theTest() { PowerMockito.mockStatic(TheUtilsClass.class); // 先指定目标类,再调用需要mock的重载方法 PowerMockito.doThrow(new RuntimeException()).when(TheUtilsClass.class); TheUtilsClass.methodToBeMocked(any(FirstParam.class), any(SecondParam.class)); } }
这种方式利用实际调用的方法签名(参数类型)来定位具体重载,避免模糊匹配导致的歧义。
方法2:通过反射获取Method对象精确指定目标方法
如果第一种方式仍有问题,可以直接通过反射获取目标方法的Method实例,传给PowerMock的when方法,彻底绕开方法名匹配的歧义:
@RunWith(PowerMockRunner.class) @PrepareForTest(TheUtilsClass.class) public class MyTest { @Test public void theTest() throws NoSuchMethodException { PowerMockito.mockStatic(TheUtilsClass.class); // 反射获取具体的重载方法 Method targetMethod = TheUtilsClass.class.getMethod( "methodToBeMocked", FirstParam.class, SecondParam.class ); // 用Method对象绑定要mock的方法 PowerMockito.doThrow(new RuntimeException()).when(TheUtilsClass.class, targetMethod); } }
原代码问题原因
你之前的写法PowerMockito.doThrow(...).when(TheUtilsClass.class, "methodToBeMocked", any(...), any(...))会让PowerMock仅通过方法名和any()匹配器查找方法,但any()无法区分不同的重载(比如另一个重载methodToBeMocked(FirstParam.class, String.class)也能匹配any(...)),因此抛出TooManyMethodsFoundException。
内容的提问来源于stack exchange,提问作者Saša
相关产品推荐
相关产品推荐

