Общее и переносимое решение было бы
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()
с его использованием.
Экранируйте себя от классов, которые будут дразнить. Создайте интерфейс любой для того, чтобы сделать то, что Вы действительно хотите (например, сокрытие того, что внешние процессы включены вообще), или только для Процесса и ProcessBuilder.
Вы не хотите тестировать, что ProcessBuilder и работа Процесса, только что можно работать с их выводом. При создании интерфейсного тривиальная реализация (который может быть осмотрен легко), делегаты в ProcessBuilder и Процессе, другая реализация дразнит это поведение. Позже у Вас могла бы даже быть другая реализация, которая делает то, в чем Вы нуждаетесь, не запуская другой процесс.
В новых версиях 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);
}
}