Cześć! Testuję aplikację konsolową, która pobiera wzór String jako pierwszy parametr oraz kolejny ciąg znaków String jako drugi parametr i sprawdza czy wzór znajduje się w ciągu oraz po którym znaku z ciągu występuje.
Testuję z użyciem JUnit, Cucumber i Gherkin.
Chcę przetestować, że aplikacja rzuci ArrayIndexOutOfBoundsException w momencie gdy pierwszy, drugi lub obydwa parametry są puste. Jak dotąd najbardziej sensowną metodą na to wydaje mi się, otworzenie CMD za pomocą ProcessBuilder, tam podanie ścieżki do aplikacji oraz podanie parametrów. Ta część działa, faktycznie otwiera mi się okno konsoli i widzę, że wyjątek jest rzucony. Jednak chcę to potwierdzić za pomocą asercji, a żeby to zrobić potrzebuję odczytać wyjątek z konsoli z pomocy metody testowej w moim step definition. No i tutaj rodzi się problem, czy coś takiego jest w ogóle możliwe, a jeśli tak to w jaki sposób mogę to zrobić? Wydaje mi się, że powinienem kombinować z getInputStream() / getOutputStream() z klasy Process niestety zupełnie nie mam pomysłu jak to zrobić. Poniżej moje metody @Given i @When ze step definition. Sama asercja wyjątku planowana jest w metodzie @Then.
@Given("Parameters list is empty.")
public void parametersListIsEmpty() {
args = new String[2];
args[0] = " ";
args[1] = " ";
stringBuilder = new StringBuilder();
stringBuilder.append("\" java PatternSearch.java ");
stringBuilder.append(args[0]);
stringBuilder.append(" ");
stringBuilder.append(args[1]);
stringBuilder.append("\"");
}
@When("App is run with invalid parameters")
public void appIsRunWithInvalidParameters() {
String filePath = FileSystems.getDefault().getPath("./"
+ "\\src\\main\\java\\com\\sample\\textsearch\\").toAbsolutePath().toString();
String command = stringBuilder.toString();
String[] processCommand = {"cmd.exe", "/c", "start", "cmd.exe", "/k", command};
System.out.println(filePath);
File log = null;
try {
ProcessBuilder proBuilder = new ProcessBuilder(processCommand);
proBuilder.directory(new File(filePath));
proBuilder.inheritIO();
log = new File("CMDOutput.txt");
proBuilder.redirectErrorStream(true);
proBuilder.redirectOutput(ProcessBuilder.Redirect.appendTo(log));
Process process = proBuilder.start();
//one attempt to see CMD output
String output = new String(process.getInputStream().readAllBytes());
System.out.println(output);
//another attempt to see CMD output
System.out.println(processOutput(process));
} catch (IOException e) {
e.printStackTrace();
excMessage = e.getMessage();
System.out.println(excMessage);
}
}
public String processOutput(Process process) {
String output = null;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
output = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return output;
}
ProcessBuilder i Process to na razie dla mnie czarna magia. Mój kod tworzy jeden proces cmd.exe i w nim dopiero drugi taki proces wraz ze ścieżką do aplikacji oraz komendą, domyślam się więc, że potrzebuję wyłuskać output z tego drugiego procesu.
Z góry ogromnie dziękuję za jakiekolwiek wskazówki.