fileSystem to FTPFile[]?



我只是想知道是否有一种方法可以模拟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[]作为参数的函数?

FTPFile类没有什么特别的地方可以防止嘲笑。不幸的是,使用Mockito,您无法模拟数组,因为它们是最终数组。

这个示例代码应该说明问题:

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测试类添加以下注释来创建mock数组:

@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);

相关内容

  • 没有找到相关文章

最新更新