请大家总结一下,在Mockito之上添加PowerMock的具体功能是什么?
到目前为止,我发现了这些:
它还添加了什么吗?你能用几行话总结一下吗?
在使用PowerMock时,我需要牺牲一些东西吗?
发布于 2011-06-17 12:57:26
我不知道其他的好处,但我想回答你的两个子问题(这是太长的评论):
允许在没有依赖注入的情况下进行模拟--这一点我不太清楚。你能详细说明一下吗?
我认为这来自于动机维基页面,他们描述了一种重构代码的方法,即不调用静态方法来使其可测试。对于一个我认为他们正在达到的具体例子,假设您有这段代码,并且您想测试模拟静态方法的行为的方法,而不使用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中可能发生的可怕的事情是,为了完成模拟私有和静态方法的壮举,它们使用自定义类加载器(在生产中不应该出现在运行时)并更改类的字节码。可以说,这在大多数情况下对绝大多数类都不重要,但是如果您仔细考虑一下,如果字节码已经改变了,并且某些副作用不再存在,那么您就可以根据现有的类有效地测试不同的类albiet。是的,这是一个非常学术的论点。
您可以通过不使用PowerMock的好的、全面的集成和更高级别的测试来减轻第一个参数。这样,即使您的单元测试正在使用PowerMock,您也可以对对象的行为更有信心。
我反对PowerMock的另一个论点是,它几乎太容易成为一根拐杖。我同意PowerMock可以帮助测试使用遗留代码和其他您无法控制的代码的代码。但是,我认为,当您控制需要模拟的类时,应该避免使用它。如果您使用私有方法或静态方法编写类,为了测试其他方法,需要显式地进行模拟,我的直觉会说这个方法可能做得太多了,应该重新分解和分解。如果PowerMock已经在项目中可用,您可能会忍不住嘲笑它并继续前进,这将减轻应该鼓励您重构的痛苦。是的,有时由于各种技术和非技术限制,这是不可能的,但最好是解决痛点,而不是避免它们:)
发布于 2016-08-09 00:15:34
PowerMock是对Mockito的扩展,它允许模拟静态方法、构造函数、最终类和方法、私有方法、删除静态初始化器等等。
发布于 2012-03-07 08:07:04
Powermock扩展的另一个特性是它支持对等于和哈希码的嘲弄和顽固。。
与所有将谨慎使用的powermock特性一样,但是为特定结果添加(基于价值的)相等可能会有帮助。
https://stackoverflow.com/questions/6036450
复制相似问题