Java 文件系统到FTPFile[]?
我只是想知道是否有办法模拟FTPFile数组。 我试图将一个伪FTPFile[]作为参数传递给我要测试的函数:Java 文件系统到FTPFile[]?,java,junit4,mockito,ftp-client,apache-commons-net,Java,Junit4,Mockito,Ftp Client,Apache Commons Net,我只是想知道是否有办法模拟FTPFile数组。 我试图将一个伪FTPFile[]作为参数传递给我要测试的函数: protected void indexFolder(FTPClient, FTPFile[], File, FTPFolderAssetSource); 我正在使用FakeFtpServer来伪造我的ftp服务器,顾名思义。此库允许通过以下方式伪造ftp内容: fileSystem = new WindowsFakeFileSystem(); Directo
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);
现在,我如何使用文件系统来测试需要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());
}
}
运行它,您将看到它将导致一条错误消息,该消息明确了问题:
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无法模拟/监视以下内容:
-期末班
-匿名类
-基本类型
最简单的解决方案是使用类似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);