Проблемы в session.connect() в методе, который выполняет загрузку SFTP

#java #unit-testing #mockito #powermock #jsch

#java #модульное тестирование #мокито #powermock #jsch

Вопрос:

У меня есть класс, который загружает файл с помощью SFTP. Он использует SSH-пару закрытый ключ-открытый ключ для аутентификации. Ниже приведен метод, который загружает файл. Я пишу для этого тестовый метод. Когда я вызываю этот метод из тестового класса, он завершается с ошибкой при session.connect, и после этого не выполняется ни одна строка кода.

Метод, который загружает файл с помощью SFTP:

 try (FileInputStream fileInputStream = new FileInputStream(new File(fileName));){
    JSch jsch = new JSch();
    Session session = jsch.getSession(sftpUser, sftpHost, sftpPort);
    if(sshKey.isEmpty()) {
        session.setPassword(sftpPass);
    } else {
        jsch.addIdentity(sftpHost, sshKey.getBytes(StandardCharsets.US_ASCII), null, null);
    }
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    config.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
    session.setConfig(config);
    session.connect();
    log.info("Host connected.");
    Channel channel = session.openChannel("sftp");
    channel.connect();
    log.info("sftp channel opened and connected.");
    ChannelSftp channelSftp = (ChannelSftp) channel;
    channelSftp.cd(sftpWorkingFolder);
    channelSftp.put(fileInputStream, new File(fileName).getName());
    channel.disconnect();
    session.disconnect();
} catch (JSchException | SftpException | IOException e) {
    e.printStackTrace();
}
 

Ниже приведен метод тестирования:

 @Mock
private JSch jSch;
@Mock
FileInputStream fileInputStream;
@Mock
File file;
@Mock
private Session session;
@Mock
private Channel channel;
@Mock
private ChannelSftp channelSftp;
@Mock
private Properties properties;
@Test
public void testSend() throws Exception {
    PowerMockito.whenNew(JSch.class).withNoArguments().thenReturn(jSch);
    PowerMockito.whenNew(Properties.class).withNoArguments().thenReturn(properties);
    PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(fileInputStream);
    when(jSch.getSession(any(String.class), any(String.class), anyInt())).thenReturn(session);
    doNothing().when(session).connect();
    when(session.openChannel("sftp")).thenReturn(channel);
    doNothing().when(channel).connect();
    doNothing().when(channelSftp).cd(any(String.class));
    FileUtil.send("src/test/resources/testFile.txt","abc",22,"admin","pass","fold", StringUtils.EMPTY);
}
 

Это то исключение, которое я получаю:

 com.jcraft.jsch.JSchException: java.net.ConnectException: Connection timed out: connect
 

Комментарии:

1. Сложно понять, что вы пытаетесь протестировать, потому что у вас нет никаких утверждений. В конце концов, единственное, что вас интересует, это то, что данный файл передается в channelftp.put(). Вам не нужно тестировать сам jsch, так как это сторонняя библиотека. Я предлагаю вам сначала провести рефакторинг вашего кода, чтобы он был проверяемым, что вы хотите протестировать, т. Е. Сделать session параметром вашего метода отправки.

2. похоже, вы издевались над сеансом, который используется неправильно, так как реальная реализация выдает исключение