файловая система для FTPFile []? - PullRequest
4 голосов
/ 01 февраля 2012

Я просто хочу знать, есть ли способ смоделировать массив 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 Ответ

3 голосов
/ 03 марта 2012

В классе 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 к манипулированию с помощью манипулирования байт-кодом. Затем вы можете создать фиктивный массив, добавив следующие аннотации в свой тестовый класс 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);
...