PowerMockitoを使用して、私がテストしているコードでjava.net.URLクラスを作成しようとしています。基本的には、実際のHTTPリクエストが発生するのを防ぎ、その代わりに1)リクエストが行われたときにデータをチェックし、2)擬似レスポンスで自分のテストデータを返す必要があります。これは私がしようとしているものです:PowerMockito/Mockitoを使用してURLクラスをモックできません
@RunWith(PowerMockRunner.class)
@PrepareForTest({ URL.class, MockedHttpConnection.class })
public class Test {
URL mockedURL = PowerMockito.mock(URL.class);
MockedHttpConnection mockedConnection = PowerMockito.mock(MockedHttpConnection.class);
...
PowerMockito.whenNew(URL.class).withParameterTypes(String.class).withArguments("MyURLString").thenReturn(mockedURL);
PowerMockito.when(mockedURL.openConnection()).thenReturn(mockedConnection);
...
}
私がテストしたいコードは次のようになります。私は「MyURLString」と一致するwlInvokeUrlStringを模擬
以前の私のテストシナリオでURL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
。私はまた、さまざまな他の形式のwhenNew行を使って、モックを注入しようとしました。私が何を試みても、コンストラクタを傍受することは決してありません。私がしたいのは、openConnection()の呼び出しを「キャッチ」して、本当のHTTP接続ではなく虚偽のHTTP接続を返すことだけです。
私は同じスクリプトの中でこのクラスより先に他のクラスを嘲笑しましたが、これらは期待どおりに動作しています。私は目の第二のペア(おそらく真)が必要か、URLクラスに関して独特の何かがあります。私は "whenNew(URL.class).withAnyArguments()"を使用し、 "thenReturn"を "thenAnswer"に変更すると、トリガーすることができることに気付きました。唯一の問題は私のコードのURL呼び出しを取得しないことです。私が見ているのは、URL.classの3引数コンストラクタの呼び出しで、すべてのパラメータがnullであることです。このクラスはJavaランタイムのもので、テストランナーがブートストラップしていますか?どんな助けでも大歓迎です。
これをテストするにはPowermockは必要ありません。例として、ファイルベースのパス( "file://my-test.properties")を使用するには、文字列urlをモックしてください。これはうまくいくでしょうし、必要なデータを渡すことができます –
@JérémieBもう少し詳しく説明できますか?これは、エレガントでシンプルなソリューションのようですが、テスト対象のコードはHttpURLConnectionを期待しています。ファイルを参照するURL文字列を変更するとClassCastExceptionが発生します(例:java.lang.ClassCastException:sun.net.www.protocol。 ftp.FtpURLConnectionはjava.net.HttpURLConnectionにキャストできません)。また、このアプローチを使用して、リクエストの入力パラメータをどのように検証しますか? – Jim
'HttpURLConnection'ではなく' URL'と 'URLConnection'を直接使うべきです。 'HttpURLConnection'には何も役に立ちません。これは、トランスポート層を抽象化するためのURLの目的です。 –