15

Apache Mina の使用方法を理解するのに少し苦労しています。彼らのドキュメントは、私の才能のない脳がうまくいくには少し不足しています。Java SFTP サーバー ライブラリで役立つ開始コードを見たことがあります か?

私が理解できないのは、それを使用する方法です。Mina を一種のモック サーバーとして使用して、sftp コードをチェックする単体テストをセットアップしたい、つまり、次のような単体テストを記述できるようにしたい:

@Before 
public void beforeTestSetup() {
    sshd = SshServer.setUpDefaultServer();
    sshd.setPort(22);
    sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider("hostkey.ser"));

    List<NamedFactory<UserAuth>> userAuthFactories = new ArrayList<NamedFactory<UserAuth>>();
    userAuthFactories.add(new UserAuthNone.Factory());
    sshd.setUserAuthFactories(userAuthFactories);
    sshd.setPublickeyAuthenticator(new PublickeyAuthenticator());


    sshd.setCommandFactory(new ScpCommandFactory());

    List<NamedFactory<Command>> namedFactoryList = new ArrayList<NamedFactory<Command>>();
    namedFactoryList.add(new SftpSubsystem.Factory());
    sshd.setSubsystemFactories(namedFactoryList);

    try {
        sshd.start();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Test
public void testGetFile() {

}

問題は、何を入れるかtestGetFile()です。

ルート ディレクトリ、ユーザー名、および認証キー ファイル名を指定するために、上記でさらに構成が必要かどうか疑問に思って、テスト コードを調べていました。次に、クライアントまたは独自の SFTP API コードを使用して、そこからファイルを取得してプルする必要がありますか?

これは優れた API であると確信していますが、そのための説明はあまりありません。誰か助けてもらえますか?

4

1 に答える 1

9

これが私がしたことです(JUnit):

  @Test
  public void testPutAndGetFile() throws JSchException, SftpException, IOException
  {
    JSch jsch = new JSch();

    Hashtable<String, String> config = new Hashtable<String, String>();
    config.put("StrictHostKeyChecking", "no");
    JSch.setConfig(config);

    Session session = jsch.getSession( "remote-username", "localhost", PORT);
    session.setPassword("remote-password");

    session.connect();

    Channel channel = session.openChannel( "sftp" );
    channel.connect();

    ChannelSftp sftpChannel = (ChannelSftp) channel;

    final String testFileContents = "some file contents";

    String uploadedFileName = "uploadFile";
    sftpChannel.put(new ByteArrayInputStream(testFileContents.getBytes()), uploadedFileName);

    String downloadedFileName = "downLoadFile";
    sftpChannel.get(uploadedFileName, downloadedFileName);

    File downloadedFile = new File(downloadedFileName);
    Assert.assertTrue(downloadedFile.exists());

    String fileData = getFileContents(downloadedFile);

    Assert.assertEquals(testFileContents, fileData);

    if (sftpChannel.isConnected()) {
      sftpChannel.exit();
      System.out.println("Disconnected channel");
    }

    if (session.isConnected()) {
      session.disconnect();  
      System.out.println("Disconnected session");
    }

  }

  private String getFileContents(File downloadedFile)
    throws FileNotFoundException, IOException
  {
    StringBuffer fileData = new StringBuffer();
    BufferedReader reader = new BufferedReader(new FileReader(downloadedFile));

    try {
      char[] buf = new char[1024];
      for(int numRead = 0; (numRead = reader.read(buf)) != -1; buf = new char[1024]) {
        fileData.append(String.valueOf(buf, 0, numRead));
      }
    } finally {    
      reader.close();
    }

    return fileData.toString();
  }
于 2012-08-13T22:55:46.797 に答える