ユーザーがESC
を入力したときにコンソールアプリケーションのTestNgtestケースを書き込もうとしています。この時点で、アプリケーションはメッセージを出力して終了する必要があります。 TestNgは、メッセージが印刷されるかどうかをテストします。ここでは、アプリケーション・コードがあります:TestNgコンソールアプリケーションExit with
public class ApplicationTest {
private Application app;
private ByteArrayInputStream in;
private ByteArrayOutputStream out;
@BeforeMethod
public void setUp() throws Exception {
app = new Application();
out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
}
@AfterMethod
public void tearDown() throws Exception {
System.setIn(System.in);
}
@Test
public void testESCInput() throws Exception {
in = new ByteArrayInputStream("ESC".getBytes());
System.setIn(in);
app.processInput(new Scanner(System.in));
assertTrue(out.toString().contains("Bye"));
}
}
しかしSystem.exit
とアプリケーションが終了するので、私もTestNGのは、ちょうどその前に終了しassertTrue
ラインに得ることはありません:
public class Application {
public static void doSomething(Scanner scanner) {
String inputString = scanner.nextLine();
if("ESC".equals(inputString.toUpperCase())) {
System.out.println("Bye");
System.exit(0);
}
}
}
ここでJUnitのコードです。これをテストする正しい方法はありますか?
エスケープが別のクラス(おそらく 'Runnable')に押されたときの動作を外部化することができます。次に、テストのための模擬実装を提供することができます。 –