私はEclipseのJVM引数を介してシステム変数にフォルダーパスを設定しており、自分のクラスでSystem.getProperty("my_files_path")
としてアクセスしようとしています。
このクラスのjunitテストメソッドを記述しているときに、テストクラスはJVM引数を考慮しないため、この呼び出しを模擬してみました。 PowerMockitoを使用して静的Systemクラスをモックし、_System.getProperpty
_が呼び出されているときにパスを返してみました。
クラスレベルで@RunWith(PowerMockRunner.class)
アノテーションと@PrepareForTest(System.class)
アノテーションがありました。ただし、結果としてSystemクラスがモック化されず、常にnullの結果が返されます。どんな助けでもありがたいです。
サティシュに感謝します。これは、小さな変更を除いて機能します。 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());
}
}
PowerMockが通常の方法でモックできない特定のクラスがあります。こちらをご覧ください:
ただし、これはまだ機能しない可能性があります。 「良いデザイン」の優先順位で、これらにフォールバックできます。
コードをリファクタリングします!ファイルパスを渡すためにシステムプロパティを使用することは、おそらく最善の方法ではありません。 Propertiesオブジェクトに読み込まれたプロパティファイルを使用しないのはなぜですか?このパスを知る必要があるコンポーネントにゲッター/セッターを使用しないのはなぜですか?これを行うには、もっと良い方法がたくさんあります。
これをしないと考えることができる唯一の理由は、変更できないコードをテストハーネスでラップしようとしていることです。
_@Before
_および_@After
_メソッドを使用して、システムプロパティをテストの既知の値に設定します。 _@Test
_メソッド自体の一部にすることもできます。これは、PowerMockをモックするよりもはるかに簡単です。 System.setProperty("my_files_path","fake_path");
を呼び出すだけです
システムクラスはfinalとして宣言されており、PowerMockなどのライブラリによってモックできません。ここに投稿されたいくつかの回答は正しくありません。 Apache System Utils を使用している場合は、System.getenvを直接呼び出す代わりにgetEnvironmentVariable
メソッドを使用できます。 SystemUtilsはfinalとして宣言されていないため、モックすることができます。
テストでシステムプロパティを設定し、ライブラリ システムルール のルール 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());
}
}
@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"));
}
}
SailajaはSystem.classを追加します。これは、静的なプライベートモッキングのパワーモックガイドラインに従って、テストの準備としてクラスを追加する必要があるためです。
@PrepareForTest({PathInformation.class,System.class})
これが役に立てば幸いです。それが機能しない場合は私に知らせてください