jsch mock java-mockito/powermockito

zyfwsgd6  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(498)

我试图为下面的代码编写单元测试,但遇到了困难。请帮忙。我不知道如何编写测试,尤其是关于返回void的方法,比如addidentity()和connect()。我正在使用mockito和powermockito框架。

public class A {

public method1() {
//some code here
method2();
//more code here
} 

private void method2() {
JSch jsch = new JSch();
Session jschSession = null;
    try {
        jsch.addIdentity("key");
        jschSession = jsch.getSession("userID", "somedomain", 22);
        //jsch code
        }
    }    
}

我的测试是这样的:

@Test
public void my_Test() throws JSchException {    
    A test = new A();
    JSch mockJsch = Mockito.mock(JSch.class);
    whenNew(JSch.class).withNoArguments().thenReturn(mockJsch);
    test.method1();
}
q3qa4bjr

q3qa4bjr1#

嘲笑 JSch 不会帮助您使用当前的实现,因为您使用“始终创建的新示例” JSchnew . 这样你现在就没有机会通过模拟版本的 JSch 从外面。
更好的方法是传递 JSch 作为 A . 这使您可以灵活地传递 JSch 测试时。对于运行时,您可以使用依赖注入框架(例如,spring或jakarta ee/microfile/quarkus的cdi)来获得注入的示例(在您声明一个示例之后)。
你可以重构你的类 A 如下所示:

public class A {

  private final JSch jsch;

  public A (Jsch jsch) {
    this.jsch = jsch;
  }

  public method1() {
    //some code here
    method2();
    //more code here
 } 

  private void method2() {
    com.jcraft.jsch.Session jschSession = null;
    try {
        jsch.addIdentity("key");
        jschSession = jsch.getSession("userID", "somedomain", 22);
        jschSession.setConfig("StrictHostKeyChecking", "no");
        jschSession.connect();
        Channel channel = jschSession.openChannel("sftp");
        channel.connect();
        ChannelSftp sftpObj = (ChannelSftp) channel;
        sftpObj.exit();
        jschSession.disconnect();
      }
   }    
}

然后你可以传递一个 Jsch 去你的测试班( A )并完全控制 Jsch ```
@Test
public void my_Test() throws JSchException {
JSch mockJsch = Mockito.mock(JSch.class);
A test = new A(mockJsch);
when(mockJsch.getSession("", "").thenReturn(yourSession);
test.method1();
}

这个测试不需要使用powermock,我宁愿只使用junit和mockito。

相关问题