5

Javaクラスでこのメソッドを指定すると、次のようになります。

public void execute(String command) {

    ProcessBuilder processBuilder = new ProcessBuilder(command);
    Process process = processBuilder.start();

    int exitValue = process.waitFor();
    if (exitValue != 0) {
        throw new RuntimeException("a message here...");
    }
}

私はこの方法のための適切なクロスプラットフォームユニットテストを考え出そうとしています。

すべてのオペレーティングシステム(Win、Linux、Macなど)に共通のコマンド、または単体テストでこのメソッドに渡すことができる偽のコマンドを探しています。

なにか提案を ?

4

2 に答える 2

8

このメソッドは、単体テストではテストできませんが、統合テストでのみテストできます。単体テストを行うには、小さなリファクタリングを行うことができます。新しいインターフェースProcessBuilderFactory(およびデフォルトの実装)を導入し、それをクラスに注入します。

public interface ProcessBuilderFactory {
    ProcessBuilder createProcessBuilder(String command);
}

public class DefaultProcessBuilderFactory implements ProcessBuilderFactory {
    public ProcessBuilder createProcessBuilder(String command) {
        return new ProcessBuilder(command);
    }
}

public class ProcessExecutor {
    private ProcessBuilderFactory processBuilderFactory;
    private ProcessExecutor(ProcessBuilderFactory processBuilderFactory) {
        this.processBuilderFactory = processBuilderFactory;
    }

    public void execute(String command) {
        ProcessBuilder processBuilder = processBuilderFactory.createProcessBuilder(command);
        Process process = processBuilder.start();

        int exitValue = process.waitFor();
        if (exitValue != 0) {
            throw new RuntimeException("a message here...");
        }
    }
}

次に、モックを注入して単体テストを行うことができますProcessBuilderFactory。あなたはテストを書き始め、あなたはモックを作成し、モックProcessBuilderFactoryを返しProcessBuilderます...くそー、あまりにProcessBuilderfinal:(

強いリマインダー:最初にテストを書いてください!

したがって、2つのオプションがあります。

  1. をデフォルトの実装でラップするための新しいインターフェースを導入しProcessBuilderます...作成するのと同じ方法でProcessBuilderFactory
  2. リファクタリングを元に戻し、PowerMockを見て、最終的なクラスのモックを作成します
于 2012-08-27T08:12:18.190 に答える
2

これはJavaユニットテストであるため、java.exeを標準のexeとして使用できます。言うjava.exe -version。それは常にそこにあります:)。java.homeから現在のjdkを使用し、それを使用してjava.exeを参照します

特定の要件を見て、モックフレームワークを使用できますか?(たとえばjmockit

于 2012-08-27T08:12:32.720 に答える