4

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 []を必要とする関数をテストするにはどうすればよいですか?

4

1 に答える 1

3

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テストクラスに次のアノテーションを追加して、モック配列を作成できます。

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

次に、テストメソッドで通常どおりMockitoモックを作成します。

FTPFile[] mockFTPFiles = mock(FTPFile[].class);
于 2012-03-03T16:42:05.253 に答える