Чтение / запись поддельных файлов через JUnit - PullRequest
0 голосов
/ 18 января 2019

Как вы издеваетесь над чтением / записью файлов через JUnit?

Вот мой сценарий

MyHandler.java

public abstract class MyHandler {

    private String path = //..path/to/file/here

    public synchronized void writeToFile(String infoText) {
        // Some processing
        // Writing to File Here
        File file = FileUtils.getFile(filepath);
        file.createNewFile();
        // file can't be written, throw FileWriteException
        if (file.canWrite()) {
            FileUtils.writeByteArrayToFile(file, infoText.getBytes(Charsets.UTF_8));
        } else {
            throw new FileWriteException();
        }
    }

    public String readFromFile() {
        // Reading from File here
        String infoText = "";
        File file = new File(path);
        // file can't be read, throw FileReadException
        if (file.canRead()) {
            infoText = FileUtils.readFileToString(file, Charsets.UTF_8);        
        } else {
            throw FileReadException();
        }

        return infoText
    }

}

MyHandlerTest.java

@RunWith(PowerMockRunner.class)
@PrepareForTest({
    MyHandler.class
})
public class MyHandlerTest {

    private static MyHandler handler = null;
    // Some Initialization for JUnit (i.e @Before, @BeforeClass, @After, etc)

    @Test(expected = FileWriteException.class)
    public void writeFileTest() throws Exception {

       handler.writeToFile("Test Write!");

    }

    @Test(expected = FileReadException.class)
    public void readFileTest() throws Exception {

       handler.readFromFile();

    }
}

Приведенный выше источник, Сценарий, когда файл недоступен для записи (разрешение на запись не разрешено), в порядке, однако, когда я пытаюсь создать сценарий, в котором file не читаем (разрешение на чтение не разрешено).Он всегда читает файл, я уже пытался изменить разрешение файла в тестовом коде с помощью ниже

File f = new File("..path/to/file/here");
f.setReadable(false);

Тем не менее, я сделал некоторые чтения, setReadable() всегда возвращает false (сбой) при запуске в Windowsмашина.

Есть ли способ изменить разрешение файла целевого файла программно по отношению к JUnit?

Примечание

Целевой исходный кодтест не может быть изменен, то есть Myhandler.class является устаревшим кодом, который не подлежит изменению.

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Так как Mockito не может смоделировать статические методы, вместо этого используйте фабрику File (или реорганизуйте вашу FileUtils, чтобы она была фабрикой), тогда вы можете смоделировать ее и вернуть также смоделированный экземпляр File, где вы также можете высмеивать любые File методы, которые вы хотите.

Таким образом, вместо FileUtils.getFile(filepath) теперь у вас будет что-то вроде FileFactory.getInstance().getFile(filepath), например, где вы можете легко смоделировать getFile(String) метод.

0 голосов
/ 22 января 2019

В jUnit есть удобное правило для таких сценариев, как ваш.

public class MyHandlerTest {

    @Rule
    // creates a temp folder that will be removed after each test
    public org.junit.rules.TemporaryFolder folder = new org.junit.rules.TemporaryFolder();

    private MyHandler handler;

    @Before
    public void setUp() throws Exception {
        File file = folder.newFile("myFile.txt");
        // do whatever you need with it - fill with test content and so on.
        handler = new MyHandler(file.getAbsolutePath()); // use the real thing
    }

    // Test whatever behaviour you need with a real file and predefined dataset.
}
0 голосов
/ 18 января 2019

Вместо того чтобы полагаться на права доступа к файлам операционной системы, используйте PowerMock, чтобы смоделировать FileUtils.getFile (...) и заставить его возвращать экземпляр File (например, анонимный подкласс), который возвращает определенное значение для canWrite () / canRead ().

Пересмешивание статических методов с помощью Mockito

...