fileSystem到FTPFile []?

时间:2012-02-01 16:25:29

标签: java junit4 mockito ftp-client apache-commons-net

我只想知道是否有办法模拟FTPFile数组。 我试图将伪FTPFile []作为参数传递给我想要测试的函数:

protected void indexFolder(FTPClient, FTPFile[], File, FTPFolderAssetSource);

我正在使用FakeFtpServer伪造我的ftp服务器。该库允许以这种方式伪造ftp内容:

        fileSystem = new WindowsFakeFileSystem();
    DirectoryEntry directoryEntry1 = new DirectoryEntry("c:\\");
    directoryEntry1.setPermissions(new Permissions("rwxrwx---"));
    directoryEntry1.setOwner(USER1);

    FileEntry fileEntry1 = new FileEntry("c:\\data\\file1.txt", CONTENTS);
    fileEntry1.setPermissionsFromString("rw-rw-rw-");
    fileEntry1.setOwner(USER1);
    fileEntry1.setGroup(GROUP); 

    fileSystem.add(directoryEntry1);
    fileSystem.add(fileEntry1);

    ftp = new FakeFtpServer();
    ftp.setFileSystem(fileSystem);

现在,我如何使用fileSystem测试需要FTPFile []作为参数的函数?

1 个答案:

答案 0 :(得分:3)

FTPFile类没有任何特别的内容可以阻止嘲弄。不幸的是,使用Mockito you can not mock arrays,因为它们是最终的。

此示例代码应说明问题:

import static org.mockito.Mockito.*;

import org.junit.Test;

public class TestMockArrays {
  interface Animal {
    String getName();
  }

  @Test
  public void testMockArray() {
    final Animal[] mockArray = mock(Animal[].class);

    when(mockArray[0].getName()).thenReturn("cat");
    when(mockArray[1].getName()).thenReturn("dog");
    when(mockArray[2].getName()).thenReturn("fish");

    print1st3(mockArray);
  }

  public static void print1st3(final Animal[] animals) {
    System.out.println(animals[0].getName() + " " + animals[1].getName() + " " + animals[2].getName());
  }
}

运行它,你会看到它会产生一条错误信息,显示问题所在:

<强> org.mockito.exceptions.base.MockitoException: 不能模拟/间谍类[LTestMockArrays $ Animal;

Mockito不能嘲笑/间谍:    - 最后的课程    - 匿名课程    - 原始类型

最简单的解决方案是使用像Powermock这样的Mockito扩展,它通过使用字节码操作绕过Mockito的嘲弄能力的某些限制。然后,您可以通过将以下注释添加到junit测试类来创建模拟数组:

@RunWith(PowerMockRunner.class) // Need to run with Powermock runner
@PrepareForTest(FTPFile[].class) // We prepare FTPFile[] class for test because it's final 

然后在您的测试方法中,您将正常创建Mockito mock:

FTPFile[] mockFTPFiles = mock(FTPFile[].class);