java 使用 Apache Mina 作为模拟/内存中 SFTP 服务器进行单元测试
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11837948/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using Apache Mina as a Mock/In Memory SFTP Server for Unit Testing
提问by Michael Coxon
I am having a bit of trouble working out how to use Apache Mina. Their documentation is a bit scant for my talentless brain to work out. I have seen the helpful starting code at Java SFTP server library?
我在弄清楚如何使用 Apache Mina 时遇到了一些麻烦。他们的文档对于我无能的大脑来说有点不足。我在Java SFTP 服务器库中看到过有用的启动代码 吗?
What I can't figure out is how to use it. I want to setup a unit test that checks my sftp code, using Mina as a kind of mock server, i.e., be able to write a unit test like:
我想不通的是如何使用它。我想设置一个单元测试来检查我的 sftp 代码,使用 Mina 作为一种模拟服务器,即能够编写一个单元测试,如:
@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() {
}
The question is what to put in testGetFile()
.
问题是要放入什么testGetFile()
。
I've been trawling through the test code wondering whether more configuration is needed in the above to specify a root directory, a user name and an authentication key file name. Then I'll need to get and pull files from it using a client, or my own SFTP api code?
我一直在浏览测试代码,想知道上面是否需要更多配置来指定根目录、用户名和身份验证密钥文件名。然后我需要使用客户端或我自己的 SFTP api 代码从中获取和提取文件?
I'm sure this is an excellent API, there's just not a lot of instruction for it, can anyone help?
我确定这是一个很好的 API,只是没有很多说明,有人可以帮忙吗?
采纳答案by Jason White
Here is what I did (JUnit):
这是我所做的(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();
}