我想使用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);
...
}
,我想測試看起來像這樣的代碼:
URL wlInvokeUrl = new URL(wlInvokeUrlString);
connection = (HttpURLConnection) wlInvokeUrl.openConnection();
在我的測試場景之前我嘲笑wlInvokeUrlString匹配「MyURLString」。我也嘗試過使用whenNew行的各種其他形式,試圖注入模擬。無論我嘗試什麼,它都不會攔截構造函數。我想要做的就是「捕捉」openConnection()的調用,並讓它返回我的模擬HTTP連接而不是真正的連接。
我在同一個腳本中嘲笑了這個之前的其他類,並且這些工作正常。要麼我需要第二雙眼睛(可能是真的),或者URL類有一些獨特的東西。我注意到,如果我使用「whenNew(URL.class).withAnyArguments()」並將「thenReturn」更改爲「thenAnswer」,我可以觸發它。唯一的問題是我從來沒有得到我的代碼的URL調用。我看到的是URL.class的三參數構造函數的調用,所有參數都爲空。這個類是否來自Java運行時並且由測試運行器引導?任何幫助深表感謝。
你不需要Powermock來測試這個。只是模擬字符串url,例如使用基於文件的路徑(「file://my-test.properties」)。這將起作用,並且你可以傳遞你需要的數據 –
@JérémieB你能詳細說明一下嗎?這看起來像是一個優雅而簡單的解決方案,但被測試的代碼需要HttpURLConnection,如果我將URL字符串更改爲引用文件(即java.lang.ClassCastException:sun.net.www.protocol。),我會得到一個ClassCastException。 ftp.FtpURLConnection不能轉換爲java.net.HttpURLConnection)。另外,如何使用這種方法驗證請求上的輸入參數? – Jim
您不應該直接使用'HttpURLConnection',而是使用'URL'和'URLConnection'。 'HttpURLConnection'沒有什麼用處。這是URL抽象傳輸層的目的。 –