3

FTPサーバーに接続するコードがいくつかあり、そのコードのテストケースを作成しようとしています。その際、私はMockFtpServerを使用してFTPサーバーをモックアウトし、相互作用をテストできるようにしようとしています。

http://mockftpserver.sourceforge.net/index.html

ある特定のケースでは、次のようなテストケースを使用して「接続」メソッドをテストしようとしています。

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仕様では、接続しようとすると例外がスローされる可能性があることが示されています。

http://commons.apache.org/net/api-3.1/org/apache/commons/net/SocketClient.html#connect%28java.lang.String%29

スローされる例外をテストする2番目のテストケースを作成したいと思います。これは、ドメイン名が正しくないか、FTPサーバーがダウンしている場合に発生する可能性があります。そのような場合、私のソフトウェアが適切に応答することを確認したいと思います。Mock 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オブジェクトが必要ですが、ドキュメントから、有効なオブジェクトを送信する方法を理解できません。これを実行する方法を知っている人はいますか?

ありがとう。

4

1 に答える 1

2

ここでは誰も刺しているわけではないので、試してみます。私はこれまで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);
}

SocketExceptionによってスローされた例外をテストしたいとのことですがSocketClient.connect()、これはここで少し注意が必要です。FTPエラーコードに基づいて、あなたは10000シリーズのエラーコードの1つを狙っていると思います(ここで間違っている場合は訂正してください。ただし、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);
}
于 2012-11-07T03:21:09.310 に答える