Mockito和FTPClient JUnit模拟测试

时间:2018-06-19 15:28:44

标签: java junit mockito ftp-client

我正在研究一个个人项目,以使用Java和JavaScript创建FTP客户端。

我首先创建了使用commons-net / FTPClient的FTPController类。

这是我的代码的一个示例:

public class FtpController {
 private FTPClient ftpClient;
 public boolean connect() { ... //do the connection }
 public boolean disconnect() { ... }
 public boolean store(String localNameAndPath, String remotePath, String newFilename) { ... // it call ftpClient.storeFile(...)}
 ... // other methods
}

FtpController使用本地FTP服务器在Junit类中可以正常工作,但是当服务器关闭时,测试将失败。

我使用Mockito进行测试,但它始终显示Connection timeout

我的课堂测试是这样的:

...
@Mock
FtpController ftpController;
@InjectMocks
FTPClient ftpClient;

@BeforeEach
void setUp() {
    initMocks(this);
}

@Test
void store() throws Exception {
    String remotePath = "a1/";
    String remoteFilename = "xyz.jpg";
    String localPathOfFile = "src/test/resources/f.jpg";
    boolean expected = true;
    when(ftpClient.storeFile(localPathOfFile, remotePath + remoteFilename)).theReturn(true);
    boolean result = ftpController.store(localPathOfFile, remotePath, remoteFilename);
    assertEquals(expected, result);
}

1 个答案:

答案 0 :(得分:0)

好的,所以第一件事是您正在测试FTPController,而不是FTPClient。

  • 从测试类中的FTPController和FTPClient删除注释
  • 使用@InjectMocks注释FtpController
  • 使用@Mock注释FTPClient 现在,您已经存根了FtpClient,mockito会将FTPController的FTPClient成员的private成员设置为模拟对象。

如果我对FtpController的假设是正确的,并且如果ftpClient.storeFile返回true,则返回true,那么您的测试应该在没有服务器的情况下进行。