我有一个遗留类,其中包含一个new()
调用,用于示例化LoginContext
对象:
public class TestedClass {
public LoginContext login(String user, String password) {
LoginContext lc = new LoginContext("login", callbackHandler);
}
}
我想使用Mockito模拟LoginContext
来测试这个类,因为它要求在示例化之前设置JAAS安全性,但我不确定如何在不更改login()
方法以外部化LoginContext
的情况下完成此操作。
是否可以使用Mockito来模拟LoginContext
类?
7条答案
按热度按时间ca1c2owp1#
对于未来,我建议使用Eran Harel's answer(将
new
重构到可以被模仿的工厂).但是如果你不想改变原始源代码,使用非常方便和独特的功能:间谍。从文档中:你可以创建真实的对象的间谍。当你使用间谍时,real方法被调用(除非一个方法被存根化)。
真实的的间谍应该谨慎使用,偶尔使用,例如在处理遗留代码时。
在您的情况下,您应填写:
hpxqektj2#
我完全支持Eran Harel's solution,在不可能的情况下,Tomasz Nurkiewicz's suggestion for spying是最好的。然而,值得注意的是,有些情况下两者都不适用。例如,如果
login
方法有点"强大":......而且这是旧代码,无法重构以将新
LoginContext
的初始化提取到其自己的方法并应用上述解决方案之一。为了完整起见,值得一提的是第三种技术--当
new
操作符被调用时,使用PowerMock注入模拟对象。PowerMock不是万能的,它通过在模拟的类上应用字节码操作来工作,如果被测试的类使用字节码操作或反射,这可能是一种不可靠的做法,至少从我个人的经验来看,会给测试带来性能上的影响。同样,如果没有其他选择,那么唯一的选择必须是好的选择:Mockito的现代版本提供了类似的功能,而不需要额外的PowerMock库,该库具有
mockito-inline
依赖项(而不是mockito-core
依赖项):camsedfj3#
您可以使用一个工厂来创建登录上下文,然后您可以模拟这个工厂并返回任何您想要的测试结果。
oknwwptz4#
--试验等级:
当从testLogin()调用实际方法
tc.login ("something", "something else");
时{ -此LoginContext lc设置为空,并在调用lc.doThis();
时抛出NPEy4ekin9u5#
据我所知没有,但是当你创建一个你想要测试的TestedClass的示例时,做这样的事情怎么样:
另一种选择是使用Mockito创建TestedClass的示例,并让被模拟的示例返回LoginContext。
u1ehiz5o6#
在被测类可以被修改的情况下,当需要避免字节码操作、保持速度或最小化第三方依赖性时,下面是我对使用工厂提取
new
操作的看法。有了这些,对Pojo对象的测试、Assert和验证调用就很容易了:
如果
TestClass
有多个构造函数,而您必须使用额外的参数来复制这些构造函数,那么这种方法的唯一缺点可能会出现。出于可靠的原因,您可能希望将PojoFactory接口放在Pojo类上,以及生产工厂上。
6uxekuva7#
我碰巧遇到了一个特殊的情况,我的用例类似于Mureinik的用例,但我最终使用了Tomasz Nurkiewicz的解决方案。
具体方法如下:
现在,
PowerMockRunner
无法初始化TestedClass
,因为它扩展了AARRGGHH
,而AARRGGHH
又执行了更多的上下文初始化......您可以看到这条路径将我引向何处:我需要在几层上嘲笑。显然是一种巨大的气味。我找到了一个nice hack,它对
TestedClass
的重构非常少:我创建了一个小方法此方法的作用域必须为
package
。那么您的测试存根将看起来像:
魔术就完成了。