当前位置: 首页 > 面试题库 >

单独使用PowerMock + Mockito VS Mockito

东方华晖
2023-03-14
问题内容

谁能总结一下,究竟什么功能使您在Mockito的基础上添加了PowerMock?

到目前为止,我已经找到了这些:

  • 模拟静态,最终和私有方法
  • 删除静态初始化器
  • 允许在没有依赖项注入的情况下进行嘲笑-我不清楚这一点。你能详细说明吗?

它还会添加其他内容吗?您可以分几行进行总结吗?

使用PowerMock时需要牺牲一些东西吗?


问题答案:

我不知道还有其他好处,但是我想解决您的两个子问题(这对于评论来说太长了):

允许在没有依赖项注入的情况下进行嘲笑-我不清楚这一点。你能详细说明吗?

我认为这来自Motivathtml" target="_blank">ion
Wiki页面
,他们在其中描述了一种重构代码的方法,该方法不调用静态方法以使其可测试。对于我认为他们正在得到的东西的一个具体示例,假设您有这段代码,并且想要测试模拟静态方法行为的方法,而无需使用powermock:

public class MyClass {
     public void doGetString() {
         ...
         OtherClass.getString(); //It's complex and scary and needs mocking!
         ...
     }
}

一种解决方案是将静态调用拉入其自己的对象,然后注入一个可以在测试时模拟的对象。例如,在不使用其他框架的情况下,它可能类似于:

public class MyClass {
     public static class StringGetter {
         public getString() {
             return OtherClass.getString();                 
         }
     }

     private final StringGetter getter;

     //Existing Constructor
     public MyClass() {
         this(new StringGetter());
     }

     //DI Constructor
     MyClass(StringGetter getter) {
         this.getter = getter;
     }

     public void doGetString() {
         ...
         getter.getString();
         ...
     }
}

我已经将方法的行为与静态调用的行为分开了,并且可以使用DI构造函数在测试时轻松注入模拟。当然,使用powermock可以模拟静态方法,然后运行它。

使用PowerMock时需要牺牲一些东西吗?

身体上没有,但我会从哲学上说:)。以下是我的观点,我尝试给出充分的理由,但当然它们是观点,因此请带点盐:

PowerMock可能发生的令人恐惧的事情是,为了完成模拟私有方法和静态方法的壮举,他们使用了自定义类加载器(不应在生产时的运行时出现)并更改类的字节码。
。可以说,大多数情况下,这与大多数类无关紧要,但是如果您考虑一下,如果字节码已更改,并且不再出现某些副作用,那么您将根据自己的情况有效地测试不同的类现有课程。是的,这是一个非常学术性的争论。

您可以通过进行良好的全面集成和不使用PowerMock的更高级别的测试来缓解第一个争论。这样,即使您的单元测试使用PowerMock,您也可以对对象的行为更有信心。

我反对PowerMock的另一个论点是,它几乎太容易成为拐杖。我同意PowerMock可以帮助测试使用遗留代码和您无法控制的其他代码的代码。但是我认为,当您控制需要模拟的类时,应该避免使用它。如果您使用私有方法或静态方法编写一个类,而您需要显式模拟该类以测试其他方法,那么我的直觉会认为该方法可能做得太多,应该对其进行重构和分解。在项目中已经有PowerMock时,您可能会想去模拟它并继续前进,这将减轻应鼓励您对其进行重构的痛苦。是的,有时由于各种技术和非技术限制,这是不可能的,但是



 类似资料:
  • 问题内容: 我想单独使用Django ORM。尽管搜索了一个小时的Google,但我仍然有几个问题: 是否需要我使用setting.py,/ myApp /目录和modules.py文件设置Python项目? 我可以创建一个新的并运行以使其自动设置表和关系,还是只能使用现有Django项目中的模型? 关于的问题似乎很多。如果你不调用现有模型,是否需要? 我想最简单的事情是让某人发布基本模板或流程的

  • 我正在为一个单例Java类编写单元测试(使用JUnit和Mockito)。我无法更改类实现本身。 使用PowerMockito,它是这样的(并且工作): 要求重写测试,而不使用PowerMock或PowerMockito或任何其他静态模拟API。由于我不能将单例类更改为使用依赖注入,我不确定什么是这样做的好方法。 任何帮助都将不胜感激。

  • 斯波克行为怪异

  • 我正在尝试使用PowerMockito来模拟Android Robolectric测试中的一些静态方法。我使用的是JUnit 4.8.2、Robolectric2.2、Mockito 1.9.5和PowerMock 1.9.5。由于我必须使用RoboElectricTestRunner,所以我尝试使用PowerMockRule来引导PowerMock。然而,当使用PowerMock运行测试时,不幸

  • 我编写了一个JUnit测试,使用Mockito和PowerMock模拟一些类。我试图将其转换为cucumber测试,但静态的PowerMock特性不起作用。 两类相关cucumber的提取物: 虽然这段代码在JUnit测试中工作,但它在这里失败了--它进入了方法,该方法应该被模拟,然后通过在其中执行代码而失败。我试着加了几行: 对上述两个类(当然,我不能在类中使用,因为它已经有一个注释),但这不会

  • 问题内容: 是否可以仅使用可以在大多数浏览器(IE,Mozilla,Safari)上运行的css绘制圆? 问题答案: 您可以将.before与带有unicode符号的内容一起用作圆圈(25CF)。 我建议这样做,因为边界半径在IE8及以下版本中将不起作用(我认识到这一建议有点儿想法)。