Как делают меня модульный тест метод Java, который использует ProcessBuilder и Процесс?

Общее и переносимое решение было бы

const std::string alphabet = "abcdefghijklmnopqrstuvwxyz";
for (int i = 0; alphabet[i]; ++i)
      amounts[i] = std::count(word.begin(), word.end(), alphabet[i]);

. Если можно предположить, что набор строчных букв является смежным диапазоном, это можно упростить до

for (char c = 'a'; c <= 'z'; ++c)
    amounts[c - 'a'] = std::count(word.begin(), word.end(), c);

Нет (открытый ) if выше. Конечно, ничто не мешает реализации std::count() с его использованием.

11
задан Rogério 5 April 2015 в 17:20
поделиться

2 ответа

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

Вы не хотите тестировать, что ProcessBuilder и работа Процесса, только что можно работать с их выводом. При создании интерфейсного тривиальная реализация (который может быть осмотрен легко), делегаты в ProcessBuilder и Процессе, другая реализация дразнит это поведение. Позже у Вас могла бы даже быть другая реализация, которая делает то, в чем Вы нуждаетесь, не запуская другой процесс.

11
ответ дан 3 December 2019 в 08:57
поделиться

В новых версиях JMockit (0.98+) вы сможете легко имитировать классы JRE, такие как Process и ProcessBuilder. Таким образом, нет необходимости создавать интерфейсы только для тестирования ...

Полный пример (с использованием JMockit 1.16):

public class MyProcessTest
{
    public static class MyProcess {
        public byte[] run() throws IOException, InterruptedException {
            Process process = new ProcessBuilder("my.exe").start();
            process.waitFor();

            // Simplified example solution:
            InputStream processOutput = process.getInputStream();
            byte[] output = new byte[8192];
            int bytesRead = processOutput.read(output);

            return Arrays.copyOf(output, bytesRead);
        }
   }

    @Test
    public void runProcessReadingItsOutput(@Mocked final ProcessBuilder pb)
        throws Exception
    {
        byte[] expectedOutput = "mocked output".getBytes();
        final InputStream output = new ByteArrayInputStream(expectedOutput);
        new Expectations() {{ pb.start().getInputStream(); result = output; }};

        byte[] processOutput = new MyProcess().run();

        assertArrayEquals(expectedOutput, processOutput);
    }
}
2
ответ дан 3 December 2019 в 08:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: