PowerMockito:模拟私有方法以抛出私有类

时间:2018-06-20 13:39:47

标签: java unit-testing mocking mockito powermock

我有一个看起来像这样的课:

public class Foo {
  public meth() {
    try {
      privMethod();
      System.out.println("Yay!");
    } catch (FooException e) {
      System.out.println("Boo!");
    }
  }

  private void privMethod() throws FooException {
    //doOtherStuff
    if (someCondition()) {
      throw new FooException();
    }
  }

  private class FooException extends Exception {
    FooException(String message) { super(message); }
  }
}

我想为此使用MockitoPowermock编写单元测试。我知道我可以像这样模拟私有方法:

Foo spy = PowerMockito.spy(new Foo())
PowerMockito.doNothing().when(spy, "privMethod");

但是我如何告诉它引发异常?我知道会是这样:

Powermockito.doThrow(/*what goes here?*/).when(spy, "privMethod");

那里有什么?

请注意,该异常是一个私有内部类,所以我不能只做doThrow(new FooException()),因为不能从单元测试中访问FooException

1 个答案:

答案 0 :(得分:2)

总的来说,你去。

Powermockito.doThrow(theThingToThrow)

去那里。例如doThrow(new RuntimeException("should be thrown"))。或更具体的异常,这取决于您希望被测代码对异常进行处理。

但是,当然:您想在那里实例化一个私有类。您无法做到的(很容易找到here,以了解达到此目的的极其复杂的方法)。从这个角度来看:您创建了一个很难测试的设计。答案是对设计进行重新设计,使其更易于测试。

最后的警告是:我认为您不需要为此使用 Power Mockito。间谍与普通的Mockito一起工作。

并且当不需要使用 Power Mock(ito)版本时,请不要使用它们。期。他们有自己的位置,但是说实话:通常,需要PowerMock(ito)等于“难以测试代码”。

除此之外:查看私有方法可以转换为测试实施细节。这也是在可能的情况下要避免的事情。

因此,换句话说:A)以有意义的方式测试上述代码几乎是不可能的。 B)这样做(按照问题的设想)也是一种不好的做法。因此,这里的“最佳”解决方案是退后一步,重新设计整个产品。是的,我很认真。