JUnitを使用してJavaで簡単なコマンドラインアプリケーションをテストする方法

Justin.Cooke

スキャナーを使用してsystem.inから読み取り、system.outに出力する単純なメインメソッドのコマンドラインクラスをJUnitでテストするにはどうすればよいですか。

import java.util.Scanner;

public class SimpleMainCmdApplication {

    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        System.out.println(scanner.next());
    }
}

これは、参加者がSystem.inから読み取り(スキャナーを使用)、System.outに回答を出力するmainメソッドを使用して* .javaファイルをアップロードする必要があるコースデータ構造とアルゴリズムコースを実行している非常に特殊なユースケースです。コードをアップロードすると、Webサイトはアプリケーションを構築して実行し、アルゴリズムのパフォーマンスをテストおよび測定します。

これをシミュレートする方法が欲しかったので、各割り当てにTDDアプローチを採用する一環として、JUnitを使用して簡単な統合テストを作成できます。他のスタックオーバーフロースレッドには役立つポインタがいくつかありましたが、完全な要件を満たすものはありませんでした。

Justin.Cooke

これを解決するために、コマンドライン入力とリフレクションで呼び出すメインメソッドクラスの名前を渡すことができるプライベートメソッドを作成しました。次に、標準のハムクレストマッカーを出力に適用できます。

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;
import java.lang.reflect.Method;

import org.junit.Before;
import org.junit.Test;

public class MainCmdTest {

    private ByteArrayOutputStream byteArrayOutputStream;
    private PrintStream console;

    @Before
    public void setup() {
        byteArrayOutputStream = new ByteArrayOutputStream();
        console = System.out;
    }

    @Test
    public void shouldPrintTest() throws Exception {
        runTest("test", "SimpleMainCmdApplication");
        assertThat(byteArrayOutputStream.toString(), is("test\n"));
    }

    private void runTest(final String data, final String className) throws Exception {

        final InputStream input = new ByteArrayInputStream(data.getBytes("UTF-8"));
        final InputStream old = System.in;

        try {
            System.setOut(new PrintStream(byteArrayOutputStream));
            System.setIn(input);

            final Class<?> cls = Class.forName(className);
            final Method meth = cls.getDeclaredMethod("main", String[].class);
            final String[] params = new String[]{};
            meth.invoke(null, (Object) params);

        } finally {
            System.setOut(console);
            System.setIn(old);
        }
    }
}

実際の実装では、コードの実行にかかる時間も測定し、テスト対象のしきい値制限を設定できます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

JUnitを使用して@SpringBootApplicationなしでJava Spring Bootアプリケーションをテストする方法

分類Dev

Pythonでコマンドラインアプリケーションをテストする方法は?

分類Dev

IntelliJ:コマンドラインを使用してJavaアプリケーションを起動できない

分類Dev

URL「/セッション」は有効なリソースにマッピングされませんでした| Javaを使用してwinAppDriver / Windowsアプリケーションのドライバを使用してデスクトップアプリケーションのテストを実行するには?

分類Dev

Google Drive API(Javaクライアント)を使用してアプリケーションを単体テストする方法

分類Dev

JavaアプリケーションでCソースコードを使用する最も簡単な方法は何ですか。

分類Dev

WPFウィンドウとシステムトレイアイコンを使用してコマンドライン/ Windowsサービスアプリケーションを作成するにはどうすればよいですか?

分類Dev

Installshieldのコマンドラインを使用してサイレントインストール後にアプリケーションを実行する

分類Dev

JUnitを使用してJavaFXアプリケーションをテストする

分類Dev

Cucumberrunnerを使用してSpringアプリケーションコンテキストをロードする方法

分類Dev

Cucumberrunnerを使用してSpringアプリケーションコンテキストをロードする方法

分類Dev

コマンドライン引数を覚えて、Javaアプリケーションを再起動する方法

分類Dev

esp32 arduino(ステッピングモーターコントローラーアプリケーション)のオンデマンドでハードウェアタイマー(割り込み用)を削除して再起動する方法

分類Dev

コマンドライン(pdflatexなし)を使用してテンプレートからpdfを作成する最も簡単な方法は?

分類Dev

Qt Creatorを使用して単純なOpenCLアプリケーションをコンパイルする方法は?

分類Dev

簡単な方法でデスクトップファイルを使用してすべてのアプリケーションを再インストールする方法は?

分類Dev

Autowireを使用して手動でロードするSpringアプリケーションコンテキスト

分類Dev

アンドロイドを使用して音声コマンド(グーグルアシスタント)を介して私のアンドロイドアプリケーション内で指定されたアクティビティを開く方法

分類Dev

Eclipseのコマンドハンドラーイベントからアプリケーションコンテキストを把握する方法

分類Dev

コマンドラインアクセスなしでLaravel5アプリケーションをセットアップする

分類Dev

ランドスケープオリエンテーションとAndroidのコードを追加する最も簡単な方法

分類Dev

Androidアプリケーションでc / c ++ソースコードを直接使用する簡単な方法はありますか?

分類Dev

Runtime.getRuntime()を介して、コマンドラインアプリケーションでコマンドを実行する方法。EXEC()

分類Dev

XSLスタイルシートを使用してXMLを変換する簡単なコマンドラインプログラムが必要

分類Dev

ionic3アプリケーションでカウントダウンタイマーを作成する最も簡単な方法は何ですか?

分類Dev

PowerShellコマンドを使用してAzureDataLakeストアでAzureActiveDirectoryアプリケーションのアクセス許可を設定する方法

分類Dev

Kubernetesを使用してgcloudで簡単なアプリケーションを公開する

分類Dev

qtwebdriverでQtアプリケーションをテストするためにubuntuで簡単なPythonスクリプトを起動する方法は?

分類Dev

mavenを使用して依存関係を持つ単純なコマンドラインアプリケーションをパッケージ化して実行するにはどうすればよいですか?

Related 関連記事

  1. 1

    JUnitを使用して@SpringBootApplicationなしでJava Spring Bootアプリケーションをテストする方法

  2. 2

    Pythonでコマンドラインアプリケーションをテストする方法は?

  3. 3

    IntelliJ:コマンドラインを使用してJavaアプリケーションを起動できない

  4. 4

    URL「/セッション」は有効なリソースにマッピングされませんでした| Javaを使用してwinAppDriver / Windowsアプリケーションのドライバを使用してデスクトップアプリケーションのテストを実行するには?

  5. 5

    Google Drive API(Javaクライアント)を使用してアプリケーションを単体テストする方法

  6. 6

    JavaアプリケーションでCソースコードを使用する最も簡単な方法は何ですか。

  7. 7

    WPFウィンドウとシステムトレイアイコンを使用してコマンドライン/ Windowsサービスアプリケーションを作成するにはどうすればよいですか?

  8. 8

    Installshieldのコマンドラインを使用してサイレントインストール後にアプリケーションを実行する

  9. 9

    JUnitを使用してJavaFXアプリケーションをテストする

  10. 10

    Cucumberrunnerを使用してSpringアプリケーションコンテキストをロードする方法

  11. 11

    Cucumberrunnerを使用してSpringアプリケーションコンテキストをロードする方法

  12. 12

    コマンドライン引数を覚えて、Javaアプリケーションを再起動する方法

  13. 13

    esp32 arduino(ステッピングモーターコントローラーアプリケーション)のオンデマンドでハードウェアタイマー(割り込み用)を削除して再起動する方法

  14. 14

    コマンドライン(pdflatexなし)を使用してテンプレートからpdfを作成する最も簡単な方法は?

  15. 15

    Qt Creatorを使用して単純なOpenCLアプリケーションをコンパイルする方法は?

  16. 16

    簡単な方法でデスクトップファイルを使用してすべてのアプリケーションを再インストールする方法は?

  17. 17

    Autowireを使用して手動でロードするSpringアプリケーションコンテキスト

  18. 18

    アンドロイドを使用して音声コマンド(グーグルアシスタント)を介して私のアンドロイドアプリケーション内で指定されたアクティビティを開く方法

  19. 19

    Eclipseのコマンドハンドラーイベントからアプリケーションコンテキストを把握する方法

  20. 20

    コマンドラインアクセスなしでLaravel5アプリケーションをセットアップする

  21. 21

    ランドスケープオリエンテーションとAndroidのコードを追加する最も簡単な方法

  22. 22

    Androidアプリケーションでc / c ++ソースコードを直接使用する簡単な方法はありますか?

  23. 23

    Runtime.getRuntime()を介して、コマンドラインアプリケーションでコマンドを実行する方法。EXEC()

  24. 24

    XSLスタイルシートを使用してXMLを変換する簡単なコマンドラインプログラムが必要

  25. 25

    ionic3アプリケーションでカウントダウンタイマーを作成する最も簡単な方法は何ですか?

  26. 26

    PowerShellコマンドを使用してAzureDataLakeストアでAzureActiveDirectoryアプリケーションのアクセス許可を設定する方法

  27. 27

    Kubernetesを使用してgcloudで簡単なアプリケーションを公開する

  28. 28

    qtwebdriverでQtアプリケーションをテストするためにubuntuで簡単なPythonスクリプトを起動する方法は?

  29. 29

    mavenを使用して依存関係を持つ単純なコマンドラインアプリケーションをパッケージ化して実行するにはどうすればよいですか?

ホットタグ

アーカイブ