问题标签 [powermock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
589 浏览

java - 模拟 Swing 静态方法时的 java.lang.VerifyError

我正在使用 PowerMock 在 上模拟静态方法JOptionPane,但 JRE 似乎不太符合它,因为我java.lang.VerifyError在初始化时得到了一个,因为它检查了自己的包和类的完整性。

我有一些解决方法,但我对其中任何一个都不满意:

  • JOptionPane为我需要的方法(showInputDialog等)编写一个对象包装器并提供一个接口,这样我就可以注入一个模拟或存根进行测试。这只是将问题转移到其他地方,因为我仍然需要涵盖我的包装方法,但至少它们将与逻辑隔离。

  • 使用JOptionPane类引用的实例来调用它的方法(我认为模拟实例不会有任何问题,因为类不是最终的)。缺点是我会收到很多“在实例变量上调用静态方法”的警告,但这是要付出的代价。

  • 根本不要模拟JOptionPane并使用Robot触发输入事件来处理它。这可能非常麻烦而且不太健壮......除此之外,我正在使用内部对话框,这需要额外的工作来设置JDesktopPane, JInternalFrames 等等。

还有其他想法或建议吗?

谢谢!

更新:顺便说一句,我尝试过模拟一个JOptionPane 实例,似乎方法调度程序忽略了实例,直接选择了以前存在的静态方法(毕竟这是有道理的),所以第二个选项被丢弃了。

0 投票
3 回答
772 浏览

java - 有什么办法可以代替动态方法吗?

假设我们有一个接口,它有两个方法:

该接口由MyInterfaceImpl. 在实现内部,first()调用second()检索一些结果。

我想构建一个单元测试,它将first()根据来自的内容断言来自的事物second(),类似于:

是否有一种简单的方法可以在线创建模拟,以便直接调用(委托给)2对选定方法(例如)的所有调用,而将其他一些方法(例如)替换为模拟对应物?first()MyInterfaceImplsecond()

对于静态方法,这实际上很容易使用 PowerMock 实现,但对于动态方法,我需要类似的东西。

解决方案基于

还不够好,尤其是对于具有大量方法(大量样板文件)的接口。我需要转发行为,因为real实际上取决于其他模拟。

我希望这样的事情由框架处理,而不是由我自己的班级处理。这是可以实现的吗?

0 投票
2 回答
6213 浏览

java - PowerMock:java.lang.IllegalAccessError:模拟java.util.ServiceLoader时的java.lang.Class

我正在尝试使用 PowerMock 在我的测试中模拟 java ServicesLoader(即final),它似乎失败了......

重现错误的最简单的测试用例是这样的:

我得到的例外是:

我想这与Class<T>对服务字段进行一些初始化有关,但我不确定。

解决此问题后,我还想模拟静态方法ServiceLoader.load(Class)以返回先前创建的模拟,因此可能会出现更多问题...

关于如何解决它的任何想法?

0 投票
1 回答
1216 浏览

testing - 使用 PowerMock 和 PowerMockito 进行 GWT 测试

我有一个构造函数:

如何使用 PowerMock 或 PowerMockito (Mockito) 存根 MFactory.getView() 静态方法以不制作 GWTTestCase?

谢谢!

0 投票
1 回答
2634 浏览

java - 这在 Mockito 中是否可行:when(SomeClass.getIntance()).thenReturn(myMock)?

我正在使用一些遗留代码,我必须在其中实现一个新的处理程序。在这个处理程序中,不幸的是,框架使用一些硬编码的属性文件初始化了一个对象,如下所示:

}
}

现在的问题
是:Util()它总是从固定位置加载配置文件,因此当我运行单元测试时它总是抛出 NPE,因为单元测试类路径上没有“myConfig.cfg”。

一种解决方法是将业务逻辑提取到一个单独的方法中,传入一个 Util 对象,以便我可以在测试期间传入模拟对象:

我的问题是:
有没有其他方法可以解决这个问题,而不添加 doHandle() 方法?我使用 Mockito 尝试了以下代码:

但它没有用,Util.getInstance() 没有被 myUtil 替换。

有什么想法吗?

更新:事情变得有点混乱,因为我发现 Util.getInstance() 在遗留代码库中的任何地方都被调用。因此,即使我的新代码中有一个模拟的 Util(如下面的 Stas 所述),当在其他地方调用 Util.getInstance() 时,事情仍然会中断。
显然,我不能在调用 Util.getInstance() 的遗留代码中的每个类中添加新的构造函数。


这就是我问“是否有可能在 Mockito 中有类似 when(Sth.getInstance()).thenReturn(myMock) 的东西”
的原因 ,如果是,那么对 Util.getInstance() 的所有调用都可以被模拟并获胜不再引起问题。
嗯....有什么想法吗?

****************************************************** *********************
解决方案:我认为我的解决方案是PowerMock

0 投票
2 回答
16465 浏览

java - Mockito/PowerMock:如何在 SUT 中重置模拟的静态变量?

我讨厌将单元测试引入遗留代码库,但我必须这样做。
到目前为止,我使用 Mockito 和 PowerMock 成功地将单元测试引入到遗留代码库中。工作得很好,直到我遇到这种情况:

在 SUT 中,有几个静态变量(我在 PowerMock 的帮助下模拟了这些变量,模拟静态方法和模拟构造函数)。
现在在第一个测试方法中,一切正常,模拟的静态变量返回了预期的输出值。
但是在随后的测试方法中,模拟的静态对象总是返回在第一个测试中设置的值,尽管我在测试之前确实调用了 reset() 。



由于 SUT 的构造函数仅在静态 c1 为 null 时实例化 c1 和 c2,因此它们 (c1, c2) 不会在子序列调用中重新实例化。我不明白为什么reset(c1),reset(c2)在test2中没有效果?

任何的想法?

0 投票
2 回答
4509 浏览

java - JUnit setUp 在一次测试中被调用两次并搞砸了 Powermock expectNew

在我的测试中非常奇怪的行为。

堆栈跟踪:

任何想法为什么我的 setUp 被调用两次?

我在设置中进行了一些模拟,经过验证后,我得到了预期的 2 次调用 1 次,所以我的测试失败了。

我正在使用 powermock 1.4.8、junit 4.4 和 easymock 框架

0 投票
5 回答
45105 浏览

java - PowerMock + Mockito VS Mockito 单独

谁能总结一下,究竟是什么功能让您在 Mockito 之上添加了 PowerMock?

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

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

它是否添加了其他任何东西?你能概括几行吗?

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

0 投票
1 回答
6018 浏览

testng - 模拟最后一课:powermock + easymock + testng

我是 PowerMock 的新手,找不到符合我情况的示例。

这并不复杂——我正在尝试使用 PowerMock+EasyMock 来模拟 TestNG 测试中的最终类。

这是最后一堂课:

被测类委托给最终类的一个实例:

这是测试类:

但是当我运行测试时,我得到一个非法参数异常,抱怨 MyFinalClass 不是接口:

我错过了什么?在此先感谢您的帮助!!!

0 投票
1 回答
114 浏览

junit - 正确使用“存根”

我正在尝试测试一个调用类中其他几个方法的方法。我希望其他方法被剔除,这样它们就不会被执行。我原以为使用“存根”很简单。例如:

但这似乎不起作用。当我预计它基本上是空操作时,它在“bar”方法内终止。我使用不正确吗?

谢谢。