当前位置: 首页 > 知识库问答 >
问题:

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

淳于坚壁
2023-03-14

我有一门课看起来像这样:

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); }
  }
}

我想使用Mockito和Powermock为此编写一个单元测试。我知道我可以这样模仿私有方法

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

但是我如何告诉它抛出异常呢?我知道会是这样的:

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

那里有什么?

请注意,异常是一个私有内部类,因此我不能只执行doThrow(new footexception()),因为从单元测试中无法访问footexception

共有1个答案

马欣荣
2023-03-14

一般来说,你去。

Powermockito.doThrow(theThingToThrow)

去那里。例如,像doThrow(新的运行时异常(“应该被抛出”)。或者一个更具体的异常,这取决于您希望被测代码对该异常做什么。

但是当然:你想在那里实例化一个私有类。这是你做不到的(很容易,看看这里有什么非常复杂的方法)。从这个角度来看:你创造了一个非常难以测试的设计。答案是返工设计,使其更容易测试。

最后一句警告:我认为你不应该为此使用PowerMockito。间谍和普通的莫奇托一起工作。

如果不需要使用PowerMock(ito)版本,那么就不要使用它们。时期他们有自己的位置,但老实说:大多数情况下,需要PowerMock(ito)等于“难以测试的代码”。

除此之外:查看私有方法转化为测试实现细节。这也是尽可能避免的事情。

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

 类似资料:
  • 我试图模拟一个私有方法(executeGetRequest),在我声明要为私有方法返回的模拟的那一行中,私有方法实际上是用null参数执行的,因此抛出了一个NullPointerException。 VlcPlayerMinimal。爪哇: VlcPlayerMinimalTest。爪哇: 堆栈跟踪: 它似乎PowerMockito实际上是调用的方法,我试图在行PowerMockito.do返回(

  • 有人能帮帮我吗?提前谢了。

  • 我试图在测试的类中模拟一个私有方法,如下所示。 现在我需要测试方法和mock。 我尝试创建间谍的上述类,但该方法得到调用时,我这样做下面 在第二行本身被调用。而且,不会被模仿。 也许我用错误的方式创建了间谍对象?无法执行

  • 问题内容: 我正在尝试模拟私有静态方法。见下面的代码 这是我的测试代码 但是我运行的每个瓦片都会出现此异常 我想我在嘲弄东西时做错了什么。有什么想法我该如何解决? 问题答案: 为此,您可以使用和。 此外,您必须在测试类中指定PowerMock运行器,并准备要进行测试的类,如下所示: 希望对您有帮助。

  • 问题内容: IDK(是否重复),但我确定找不到相关项目。我一直期望这真的很简单,因为通过反射它非常简单,但是我宁愿使用正确的工具来完成它。 澄清:旧版代码。没有吸气剂/二传手。 为此使用Whitebox是否正确?我以为是“超限”,即内部API的一部分?…或者那是严格的Mockito吗? 问题答案: 请参阅。 例如-给定的类需要测试: 具有以下私有实例: 然后可以用来设置的私有状态,以便可以对其进行