0

私のプロセスでは、システム変数にコンテンツを追加するだけですPATH。実際、私はこれを使用するものでこれを行っていProcessますsetx.exe

public void changePath(String newPath ) {
  String path = System.getenv("PATH") + ";";
  String[] cmd = new String[]{"C:\\Windows\\System32\\setx.exe", "PATH", 
      path+newPath, "-m"};
  ProcessBuilder builder = new ProcessBuilder(cmd);
  ...
}

そこで、テストケースを書いてみました。

Class UpdatePathTest {

  @Test
  public void testUpdatePath() {
    //call the method that update the path
    changePath("C:\\somebin");
    assertTrue(System.getenv("PATH").contains("C:\\somebin")); //fails
    // ProcessBuilder with command String[]{"cmd", "/C", "echo", "%PATH%"}; will fail too.
    //and the above in a new Thread will fail too.
  }

}

では、新しいPATH値を取得する方法はありますか?デスクトップアプリケーションをインストールするjarを開発しているので、新しいパスを書き込むことが唯一のオプションです。

4

1 に答える 1

1

単体テストでは、パスを変更することが良い考えかどうかはわかりません。テストが失敗した場合はどうなりますか?関連するすべての整理を確実に行う必要があります。

依存性を反転し、依存性注入を使用することを検討してください。

この記事はそれを非常によく説明していると思います。

したがって、次のようなメソッドを使用する代わりに、次のようにします。

public void method() {
    String path = System.getenv("PATH") + ";";
    //do stuff on path
}

行うことを検討してください:

public void method(String path) {
    //do stuff on path
}

これにより、パスをスタブ化できます。メソッドのシグネチャを変更できない場合は、ファクトリパターンを使用し、テストファクトリを使用してパスを取得することを検討してください。

編集:質問に更新した後

ここで考えなければならないのは、テストしていることです。C:\ Windows \ System32 \ setx.exeを呼び出すと、APIドキュメントを読み、正しいパラメーターを使用して呼び出すことになります。これは、JavaAPIで別のメソッドを呼び出すのとよく似ています。たとえば、リストを操作している場合、それはゼロベースであることが「わかっています」。これをテストする必要はありません。APIを読むだけで、コミュニティがこれをバックアップします。changePathをテストするために、ProcessBuilderに何が入るのかをテストするのはおそらくあなただと思います。ここでもAPIドキュメントを読み、正しい変数を渡していると想定する必要があります。(下部の//1を参照)また、ProcessBuilderが正しく機能し、Oracle(またはおそらくSun)の担当者がAPIドキュメントに実装していることを前提としています。

したがって、あなたがしたいことは、あなたが理解しているように、仕様に一致する変数をProcessBuilderに渡していることを確認することです。このために、ProcessBuilderをモックしてから、正しいパラメーターを渡し、このクラスで正しいメソッドを呼び出していることを確認できます。

一般に、Windows関数をテストしたくないが、Javaとそれらとの相互作用をテストしたいので、テストするのは難しいものです。

// 1この外部コマンドを呼び出す際に私が抱えていた主な問題は、APIドキュメントを正しく理解するかコマンドを設定することです。通常、コマンドラインを取り出して、メソッドを正しく使用していることを確認する必要があります(特にcmd関数)。これは、cmd関数の使用方法を理解し、それをProcessBuilderにコーディングしてから、テストを作成することを意味する場合があります(または、ProcessBuilder / testではその逆)。理想的な方法ではありませんが、ドキュメントを理解するのが難しい場合があります。

于 2012-09-03T18:48:00.377 に答える