web-dev-qa-db-ja.com

システムプロパティを取得するためのモックシステムクラス

私はEclipseのJVM引数を介してシステム変数にフォルダーパスを設定しており、自分のクラスでSystem.getProperty("my_files_path")としてアクセスしようとしています。

このクラスのjunitテストメソッドを記述しているときに、テストクラスはJVM引数を考慮しないため、この呼び出しを模擬してみました。 PowerMockitoを使用して静的Systemクラスをモックし、_System.getProperpty_が呼び出されているときにパスを返してみました。

クラスレベルで@RunWith(PowerMockRunner.class)アノテーションと@PrepareForTest(System.class)アノテーションがありました。ただし、結果としてSystemクラスがモック化されず、常にnullの結果が返されます。どんな助けでもありがたいです。

11

サティシュに感謝します。これは、小さな変更を除いて機能します。 System.classの代わりにテストケースをテストするクラスを準備して、PrepareForTest(PathFinder.class)を作成しました

また、モックは1回しか機能しないため、モックした直後にメソッドを呼び出しました。参考のために私のコード:

@RunWith(PowerMockRunner.class)
@PrepareForTest(PathInformation.class)
public class PathInformationTest {

    private PathFinder pathFinder = new PathFinder();

@Test
    public void testValidHTMLFilePath() { 
        PowerMockito.mockStatic(System.class);
        PowerMockito.when(System.getProperty("my_files_path")).thenReturn("abc");
        assertEquals("abc",pathFinder.getHtmlFolderPath());
    }
}
15

PowerMockが通常の方法でモックできない特定のクラスがあります。こちらをご覧ください:

ただし、これはまだ機能しない可能性があります。 「良いデザイン」の優先順位で、これらにフォールバックできます。

  1. コードをリファクタリングします!ファイルパスを渡すためにシステムプロパティを使用することは、おそらく最善の方法ではありません。 Propertiesオブジェクトに読み込まれたプロパティファイルを使用しないのはなぜですか?このパスを知る必要があるコンポーネントにゲッター/セッターを使用しないのはなぜですか?これを行うには、もっと良い方法がたくさんあります。

    これをしないと考えることができる唯一の理由は、変更できないコードをテストハーネスでラップしようとしていることです。

  2. _@Before_および_@After_メソッドを使用して、システムプロパティをテストの既知の値に設定します。 _@Test_メソッド自体の一部にすることもできます。これは、PowerMockをモックするよりもはるかに簡単です。 System.setProperty("my_files_path","fake_path");を呼び出すだけです

7
Matt Lachman

システムクラスはfinalとして宣言されており、PowerMockなどのライブラリによってモックできません。ここに投稿されたいくつかの回答は正しくありません。 Apache System Utils を使用している場合は、System.getenvを直接呼び出す代わりにgetEnvironmentVariableメソッドを使用できます。 SystemUtilsはfinalとして宣言されていないため、モックすることができます。

6
ekcrisp

テストでシステムプロパティを設定し、ライブラリ システムルール のルール RestoreSystemProperties を使用して、テスト後にシステムプロパティが復元されることを確認します。

public class PathInformationTest {
  private PathFinder pathFinder = new PathFinder();

  @Rule
  public TestRule restoreSystemProperties = new RestoreSystemProperties();

  @Test
  public void testValidHTMLFilePath() { 
    System.setProperty("my_files_path", "abc");
    assertEquals("abc",pathFinder.getHtmlFolderPath());
  }
}
5
Stefan Birkner
@RunWith(PowerMockRunner.class)
@PrepareForTest(System.class)
public class MySuperClassTest {   
@Test
public void test(){ 
    PowerMockito.mockStatic(System.class);
    PowerMockito.when(System.getProperty("Java.home")).thenReturn("abc");
    System.out.println(System.getProperty("Java.home"));
}
} 
0
geddamsatish

SailajaはSystem.classを追加します。これは、静的なプライベートモッキングのパワーモックガイドラインに従って、テストの準備としてクラスを追加する必要があるためです。

 @PrepareForTest({PathInformation.class,System.class})

これが役に立てば幸いです。それが機能しない場合は私に知らせてください

0
geddamsatish