一尘不染

Java 使用Mockito通过new()调用测试类

java

我有一个旧类,其中包含用于实例化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类?


阅读 730

收藏
2020-03-19

共1个答案

一尘不染

对于将来,我会推荐伊兰·哈雷尔(Eran Harel)的答案(将new工厂搬迁到可以嘲笑的工厂)。但是,如果你不想更改原始源代码,请使用非常方便且独特的功能:spies。从文档中:

你可以创建真实对象的间谍。当你使用间谍时,将调用实际方法(除非对方法进行了加注)。

真正的间谍应该小心谨慎地使用,例如在处理遗留代码时。

在你的情况下,你应该写:

TestedClass tc = spy(new TestedClass());
LoginContext lcMock = mock(LoginContext.class);
when(tc.login(anyString(), anyString())).thenReturn(lcMock);
2020-03-19