Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使MockFTPServer引发异常_Java_Unit Testing_Ftp_Mocking - Fatal编程技术网

Java 如何使MockFTPServer引发异常

Java 如何使MockFTPServer引发异常,java,unit-testing,ftp,mocking,Java,Unit Testing,Ftp,Mocking,我有一些连接到FTP服务器的代码,我正在尝试为这些代码编写测试用例。为此,我一直在尝试使用MockFtpServer模拟FTP服务器,以便测试我的交互 在一个特定的案例中,我试图用一个类似以下的测试用例测试我的“connect”方法: public class FTPServiceTestWithMock { private FakeFtpServer server; private FTPService service; private int controller

我有一些连接到FTP服务器的代码,我正在尝试为这些代码编写测试用例。为此,我一直在尝试使用MockFtpServer模拟FTP服务器,以便测试我的交互

在一个特定的案例中,我试图用一个类似以下的测试用例测试我的“connect”方法:

public class FTPServiceTestWithMock {

    private FakeFtpServer server;
    private FTPService service;
    private int controllerPort;

    @Before
    public void setup() {
        server = new FakeFtpServer();
        server.setServerControlPort(0); // Use free port - will look this up later

        FileSystem fileSystem = new WindowsFakeFileSystem();
        fileSystem.add(new DirectoryEntry("C:\\temp"));
        fileSystem.add(new FileEntry("C:\\temp\\sample.txt", "abc123"));
        server.setFileSystem(fileSystem);
        server.addUserAccount(new UserAccount("user", "pass", "C:\\"));
        server.start();
        controllerPort = server.getServerControlPort();

        service = new FTPService();
    }

    @After
    public void teardown() {
        server.stop();
    }

    @Test
    public void testConnectToFTPServer() throws Exception {
        String testDomain = "testdomain.org";
        String expectedStatus = 
            "Connected to " + testDomain + " on port " + controllerPort;

        assertEquals(
            expectedStatus, 
            service.connectToFTPServer(testDomain, controllerPort)
        );
    }

}
这段代码工作得很好——它设置了一个假的FTP服务器,并对我的代码进行测试,以确保它可以连接并返回适当的消息

但是,我的FTP客户端的API规范显示,当我尝试连接时,可能会引发异常

我想写第二个测试用例来测试抛出的异常,这很可能是域名不正确或FTP服务器关闭的情况。在这种情况下,我希望确保我的软件能够正确响应。我在模拟FTP服务器站点中找到了关于“自定义命令处理程序”的信息,但我不知道如何使一个抛出异常。这就是我所拥有的:

public void testConnectToFTPServerConnectionFailed() throws Exception {
    ConnectCommandHandler connectHandler = new ConnectCommandHandler();
    connectHandler.handleCommand(/* Don't know what to put here */);
    server.setCommandHandler(CommandNames.CONNECT, connectHandler);
}
handleCommand方法需要一个Command对象和一个Session对象,但我无法从文档中找出如何获取要发送的有效对象。有人知道怎么做吗


谢谢。

既然这里没人敢捅,我就试试看。我以前从未使用过MockFtpServer,所以这是我的第一次尝试

在我看来,测试服务器是否关闭的最简单方法就是关闭服务器

@Test(expected = IOException.class)
public void testConnectToFTPServer_ServerDown() throws Exception {
    // kill the server
    server.stop();
    service.connectToFTPServer("testdomain.org", controllerPort);
}
如果要测试用户名和密码是否无效,您可以将FTP回复代码设置为430:-

@Test(expected = IllegalStateException.class)
public void testConnectToFTPServer_InvalidUserPassword() throws Exception {
    // assuming you already started it in setup(), you may want to stop it first
    if (server.isStarted()) {
        server.stop();
    }

    ConnectCommandHandler connectCommandHandler = (ConnectCommandHandler) server.getCommandHandler(CommandNames.CONNECT);

    // 430 = FTP error code for "Invalid username or password"
    connectCommandHandler.setReplyCode(430);
    server.setCommandHandler(CommandNames.CONNECT, connectCommandHandler);
    server.start();

    service.connectToFTPServer("testdomain.org", controllerPort);
}
我知道您想测试由
SocketClient.connect()
引发的
SocketException
异常。。。这一个有点棘手。基于,我相信您正在为10000系列错误代码中的一个射击(如果我在这里错了,请纠正我,但我不是FTP专家)。这个10000系列错误代码的问题是,它将使您的测试无限期地旋转,因为该错误代码指示远程服务器无法连接,因此在对MockFtpServer进行测试时,测试实际上不知道何时停止。因此,在本例中,我将测试设置为5秒内超时(我认为这是合理的)。当然,这里不会抛出
SocketException
,但我认为该行为与实际实现代码足够接近

@Test(timeout = 5000)
public void testConnectToFTPServer_InvalidHostName() throws Exception {
    // assuming you already started it in setup(), you may want to stop it first
    if (server.isStarted()) {
        server.stop();
    }

    ConnectCommandHandler connectCommandHandler = (ConnectCommandHandler) server.getCommandHandler(CommandNames.CONNECT);

    // 10060 = FTP error code for "Cannot connect to remote server."
    connectCommandHandler.setReplyCode(10060);
    server.setCommandHandler(CommandNames.CONNECT, connectCommandHandler);
    server.start();

    service.connectToFTPServer("testdomain.org", controllerPort);
}

谢谢你的建议,limc。几张便条。。。首先,您不需要为了替换CommandHandler的功能而停止服务器—它只是帮助保持代码更干净。对于某些事情,比如测试一个错误的密码,只需发送一个错误的密码并获得一个正确的回复代码就足够简单了。这非常方便的地方是做一些类似于最终测试的事情,在这个测试中,您返回一个10060回复代码,显示那里有一个套接字,但不接受连接。