JUnitテストでコンソールからデータを自動的に入力する方法



How Automatically Input Data From Console With Junit Test



記事のディレクトリ


要求する

次の例のように、JUnitを使用して、入力が必要なデータを含むメソッド(containing Scanner Methodなど)をテストします。メインプログラムをテストする場合、メインプログラムにユーザー名を入力する必要がありますが、 JUnitテストでは、通常、コンソールにデータを手動で入力するのではなく、自動的にテストできる必要があります。

public class App { public static void main(String[] args) { System.out.print('please enter user name:') Scanner scanner = new Scanner(System.in) String username = scanner.nextLine() scanner.close() System.out.println('username:' + username) } }

解決策を探す

長い間インターネットで検索したところ、何も見つからなかったと言えます。間違った方向を探しているのか、それとも自分のニーズとは違う意味を持っているのかわかりません。いくつかのスーパーウォーターの記事もScannerそれが私のような同じようなタイトルだとは言いませんでした、そして私はますます怒りを感じます。



その後、多くの記事がこの方法について言及していることがわかりました:System.setIn(InputStream in)、APIをチェックして解決策を見つけました。
画像

プログラム

jdk独自のものを使用してください:System.setIn(InputStream in):「標準」入力ストリームを再配布することは、コンソールからデータを取得するのではなく、ストリームからデータを取得することと同じです。文字列の場合、最初にバイト配列に変換してからストリームに変換できます。ByteArrayInputStream(byte buf[])継承元InputStreamSystem.setIn()メソッドのパラメータとして使用できます。
画像
テストは次のとおりです。



public class AppTest { /** * Test method for {@link xyz.yansheng.main.App#main(java.lang.String[])}. */ @Test public void testMain() { String username= 'Jack' // System.setIn(InputStream in): Reallocate the 'standard' input stream. System.setIn(new ByteArrayInputStream(username.getBytes())) App.main(null) // Output: username: Jack } }

注:このプログラムは非常に単純なテストシーケンスであるため、JUnitアサーションなどのテストメソッドは設定されていません。 JUnitテストシミュレーションを使用して、コンソールからデータを自動的に入力します


参照: