PowerMockito调用抛出异常失败的私有方法

时间:2017-06-29 19:53:26

标签: java mockito powermock

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

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.InvocationTargetException

但是,如果我在return Class.forName(str)方法中用return Boolean.TRUE.getClass();替换foo - 一切正常。

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

1 个答案:

答案 0 :(得分:0)

  1. 如果你不需要真正的方法调用,你可以使用mock - 将spy()更改为mock()
  2. MyClass pl = PowerMockito。 spy(new MyClass());

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

    并且您的代码无需任何更改即可运行,但spy / mock除外。

    1. 如果您需要使用实际方法调用 SPY()
    2. 这样做:

      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
          }
      
        

      但是,如果我将使用return替换返回Class.forName(str)   Boolean.TRUE.getClass();在foo方法中 - 一切都很好。

      这可以归功于1.它叫做一个真正的方法,2。你后退布尔类。但是当你使用anyString()调用它时会调用real方法并将null作为值传递。

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

相关问题