问题标签 [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.
java - 模拟 Swing 静态方法时的 java.lang.VerifyError
我正在使用 PowerMock 在 上模拟静态方法JOptionPane
,但 JRE 似乎不太符合它,因为我java.lang.VerifyError
在初始化时得到了一个,因为它检查了自己的包和类的完整性。
我有一些解决方法,但我对其中任何一个都不满意:
JOptionPane
为我需要的方法(showInputDialog
等)编写一个对象包装器并提供一个接口,这样我就可以注入一个模拟或存根进行测试。这只是将问题转移到其他地方,因为我仍然需要涵盖我的包装方法,但至少它们将与逻辑隔离。使用JOptionPane
类引用的实例来调用它的方法(我认为模拟实例不会有任何问题,因为类不是最终的)。缺点是我会收到很多“在实例变量上调用静态方法”的警告,但这是要付出的代价。根本不要模拟
JOptionPane
并使用Robot
触发输入事件来处理它。这可能非常麻烦而且不太健壮......除此之外,我正在使用内部对话框,这需要额外的工作来设置JDesktopPane
,JInternalFrame
s 等等。
还有其他想法或建议吗?
谢谢!
更新:顺便说一句,我尝试过模拟一个JOptionPane
实例,似乎方法调度程序忽略了实例,直接选择了以前存在的静态方法(毕竟这是有道理的),所以第二个选项被丢弃了。
java - 有什么办法可以代替动态方法吗?
假设我们有一个接口,它有两个方法:
该接口由MyInterfaceImpl
. 在实现内部,first()
调用second()
检索一些结果。
我想构建一个单元测试,它将first()
根据来自的内容断言来自的事物second()
,类似于:
是否有一种简单的方法可以在线创建模拟,以便直接调用(委托给)2
对选定方法(例如)的所有调用,而将其他一些方法(例如)替换为模拟对应物?first()
MyInterfaceImpl
second()
对于静态方法,这实际上很容易使用 PowerMock 实现,但对于动态方法,我需要类似的东西。
解决方案基于
还不够好,尤其是对于具有大量方法(大量样板文件)的接口。我需要转发行为,因为real
实际上取决于其他模拟。
我希望这样的事情由框架处理,而不是由我自己的班级处理。这是可以实现的吗?
java - PowerMock:java.lang.IllegalAccessError:模拟java.util.ServiceLoader时的java.lang.Class
我正在尝试使用 PowerMock 在我的测试中模拟 java ServicesLoader
(即final
),它似乎失败了......
重现错误的最简单的测试用例是这样的:
我得到的例外是:
我想这与Class<T>
对服务字段进行一些初始化有关,但我不确定。
解决此问题后,我还想模拟静态方法ServiceLoader.load(Class)
以返回先前创建的模拟,因此可能会出现更多问题...
关于如何解决它的任何想法?
testing - 使用 PowerMock 和 PowerMockito 进行 GWT 测试
我有一个构造函数:
如何使用 PowerMock 或 PowerMockito (Mockito) 存根 MFactory.getView() 静态方法以不制作 GWTTestCase?
谢谢!
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
java - Mockito/PowerMock:如何在 SUT 中重置模拟的静态变量?
我讨厌将单元测试引入遗留代码库,但我必须这样做。
到目前为止,我使用 Mockito 和 PowerMock 成功地将单元测试引入到遗留代码库中。工作得很好,直到我遇到这种情况:
在 SUT 中,有几个静态变量(我在 PowerMock 的帮助下模拟了这些变量,模拟静态方法和模拟构造函数)。
现在在第一个测试方法中,一切正常,模拟的静态变量返回了预期的输出值。
但是在随后的测试方法中,模拟的静态对象总是返回在第一个测试中设置的值,尽管我在测试之前确实调用了 reset() 。
由于 SUT 的构造函数仅在静态 c1 为 null 时实例化 c1 和 c2,因此它们 (c1, c2) 不会在子序列调用中重新实例化。我不明白为什么reset(c1),reset(c2)在test2中没有效果?
任何的想法?
java - JUnit setUp 在一次测试中被调用两次并搞砸了 Powermock expectNew
在我的测试中非常奇怪的行为。
堆栈跟踪:
任何想法为什么我的 setUp 被调用两次?
我在设置中进行了一些模拟,经过验证后,我得到了预期的 2 次调用 1 次,所以我的测试失败了。
我正在使用 powermock 1.4.8、junit 4.4 和 easymock 框架
java - PowerMock + Mockito VS Mockito 单独
谁能总结一下,究竟是什么功能让您在 Mockito 之上添加了 PowerMock?
到目前为止,我已经找到了这些:
- 模拟静态、最终和私有方法
- 移除静态初始化器
- 允许在没有依赖注入的情况下进行模拟 - 我不清楚这一点。你能详细说明吗?
它是否添加了其他任何东西?你能概括几行吗?
使用 PowerMock 时我需要牺牲一些东西吗?
testng - 模拟最后一课:powermock + easymock + testng
我是 PowerMock 的新手,找不到符合我情况的示例。
这并不复杂——我正在尝试使用 PowerMock+EasyMock 来模拟 TestNG 测试中的最终类。
这是最后一堂课:
被测类委托给最终类的一个实例:
这是测试类:
但是当我运行测试时,我得到一个非法参数异常,抱怨 MyFinalClass 不是接口:
我错过了什么?在此先感谢您的帮助!!!
junit - 正确使用“存根”
我正在尝试测试一个调用类中其他几个方法的方法。我希望其他方法被剔除,这样它们就不会被执行。我原以为使用“存根”很简单。例如:
但这似乎不起作用。当我预计它基本上是空操作时,它在“bar”方法内终止。我使用不正确吗?
谢谢。