我有一个旧类,其中包含用于实例化LoginContext()的new()调用:
public class TestedClass { public LoginContext login(String user, String password) { LoginContext lc = new LoginContext("login", callbackHandler); } }
我想使用Mockito测试类来模拟LoginContext,因为它要求在实例化之前设置JAAS安全性,但是我不确定如何在不更改login()方法以外部化LoginContext的情况下进行此操作。是否可以使用Mockito模拟LoginContext类?
对于将来,我会推荐伊兰·哈雷尔(Eran Harel)的答案(将new工厂搬迁到可以嘲笑的工厂)。但是,如果你不想更改原始源代码,请使用非常方便且独特的功能:spies。从文档中:
new
你可以创建真实对象的间谍。当你使用间谍时,将调用实际方法(除非对方法进行了加注)。
真正的间谍应该小心谨慎地使用,例如在处理遗留代码时。
在你的情况下,你应该写:
TestedClass tc = spy(new TestedClass()); LoginContext lcMock = mock(LoginContext.class); when(tc.login(anyString(), anyString())).thenReturn(lcMock);