2017-09-19 15 views
2

私は、Springブートアプリケーション用のjunitとmockito(これは非常に新しい)でユニットテストを書こうとしています。基本的に私のコードでは、自分のコードにString URL = System.getenv("VARIABLE")でアクセスできるmanifest.ymlファイル(デプロイ用)の特定のURLの環境変数を指定しました。私はユニットテストで多くの問題を抱えていますが、URL変数は明らかに未定義です。私はソリューションhereを試しましたが、実際のテスト自体から呼び出す場合は環境変数を嘲笑するだけであり、環境変数がコードからアクセスできるかどうかは分かりません。junitでSystem.getenvが呼び出されるのに問題がある

テストを実行するときにコード内でアクセスできる環境変数を設定できるように設定する方法はありますか?

答えて

2

PowerMockitoを使用すると、静的メソッドをモックできます。このコードは、私は、これはあなたが達成しようとしているものを示していると信じてSystemクラスをモックとgetenv()

@RunWith(PowerMockRunner.class) 
@PrepareForTest({System.class}) 
public class Xxx { 

    @Test 
    public void testThis() throws Exception { 
     System.setProperty("test-prop", "test-value"); 
     PowerMockito.mockStatic(System.class); 

     PowerMockito.when(System.getenv(Mockito.eq("name"))).thenReturn("bart"); 
     // you will need to do this (thenCallRealMethod()) for all the other methods 
     PowerMockito.when(System.getProperty(Mockito.any())).thenCallRealMethod(); 

     Assert.assertEquals("bart", System.getenv("name")); 

     String value = System.getProperty("test-prop"); 

     Assert.assertEquals("test-value", System.getProperty("test-prop")); 
    } 
} 

をスタブ示しています。 There PowerMockito.spy()を使用してこれを行うより洗練された方法ですが、私はそれを覚えていません。

コードによって直接的または間接的に呼び出されるSystem.classの他のすべてのメソッドに対しては、thenCallRealMethod()を実行する必要があります。

+0

ちょっとテストで環境変数は必要ありません。テストだけで環境変数を使ってコードを実行すると、設定した値に定義されます。 B/cはい、はい、それはテストで定義されていますが、テストが実際のコードを実行するとき、テストされています、それは未定義です。 – PCR

+0

私が追加したコードは、System.getenv( "name")が期待値を返すという事実をデモしています。単体テスト以外のコードでSystem.getenv()を呼び出すと、同様の結果が表示されます(つまり、単体テスト以外のコードでもSystemは動作し続けます)。したがって、あなたの単体テストで、次のような行を持ってください: 'PowerMockito.when(System.getenv(Mockito.eq(" name ")))。thenあなたの環境をセットアップするために返す(" bart ");あなたの非単体テストコードは、それらの値を表示する必要があります – mangotang

+0

これは動作しない場合は、問題をポストバックと私はおそらくそれであなたを助けることができます。 – mangotang

関連する問題