gpt4 book ai didi

java - PowerMockito调用抛出异常的私有(private)方法失败

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:37 25 4
gpt4 key购买 nike

我尝试在类 MyClass 中模拟以下方法 foo:

private Class<?> foo(final String str) throws ClassNotFoundException{
return Class.forName(str);
}

所以我写道:

MyClass pl = PowerMockito.spy(new MyClass());

try {
PowerMockito.when(pl, PowerMockito.method(MyClass.class, "foo", String.class))
.withArguments(anyString())
.thenReturn(Boolean.TRUE.getClass());
} catch (Exception e) {
e.printStackTrace(); // catch ClassNotFoundException
}

它不起作用并抛出异常java.lang.reflect.InitationTargetException

但是,如果我将 foo 方法中的 return Class.forName(str) 替换为 return Boolean.TRUE.getClass(); - 一切都可以。

如何告诉 PowerMockito 调用失败时抛出异常的 foo 方法?

最佳答案

  1. 如果您不需要真正的方法调用,并且可以使用mock - 将spy()更改为mock()

MyClass pl = PowerMockito.spy(new MyClass());

MyClass pl = PowerMockito.mock(MyClass.claa);

并且您的代码无需任何更改即可运行,除了 spy /模拟之外。

  • 如果您需要 SPY() 进行真正的方法调用
  • 这样做:

    MyClass pl = PowerMockito.spy(new MyClass());

        try {
    PowerMockito.doReturn(Boolean.TRUE.getClass())
    .when(pl, PowerMockito.method(MyClass.class, "foo", String.class))
    .withArguments(anyString());
    } catch (Exception e) {
    e.printStackTrace(); // catch ClassNotFoundException
    }
    <小时/>

    However, if i'll replace return Class.forName(str) with return Boolean.TRUE.getClass(); in foo method - everything is ok.

    这之所以有效,是因为 1. 它被称为真正的方法,2. 你重新运行 boolean 类。但是当您使用 anyString() 调用时,它会调用实际方法并传递 null 作为值。

    阅读Important gotcha on spying real objects! :):)

    关于java - PowerMockito调用抛出异常的私有(private)方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44833861/

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