[英]mock https request in java
假設我正在編寫一個應用程序,我需要能夠做到這樣的事情:
String url = "https://someurl/";
GetMethod method = new GetMethod(URLEncoder.encode(url));
String content = method.getResponseBodyAsString();
有沒有辦法提供一個模擬服務器讓我處理https請求? 我正在尋找的是一種編寫單元測試的方法,但是我需要能夠模擬實際發布到https:// someurl的部分,這樣我才能得到一個已知的響應。
看看jadler( http://jadler.net ),這是我一直在研究的http存根/模擬庫。 1.0.0穩定版本剛剛發布,它應該提供您請求的功能:
@Test
public void getAccount() {
onRequest()
.havingMethodEqualTo("GET")
.havingURIEqualTo("/accounts/1")
.havingBody(isEmptyOrNullString())
.havingHeaderEqualTo("Accept", "application/json")
.respond()
.withTimeout(2, SECONDS)
.withStatus(200)
.withBody("{\"account\":{\"id\" : 1}}")
.withEncoding(Charset.forName("UTF-8"))
.withContentType("application/json; charset=UTF-8");
final AccountService service = new AccountServiceRestImpl("http", "localhost", port());
final Account account = service.getAccount(1);
assertThat(account, is(notNullValue()));
assertThat(account.getId(), is(1));
}
@Test
public void deleteAccount() {
onRequest()
.havingMethodEqualTo("DELETE")
.havingPathEqualTo("/accounts/1")
.respond()
.withStatus(204);
final AccountService service = new AccountServiceRestImpl("http", "localhost", port());
service.deleteAccount(1);
verifyThatRequest()
.havingMethodEqualTo("DELETE")
.havingPathEqualTo("/accounts/1")
.receivedOnce();
}
你基本上有兩個選擇:
1.摘要對框架的調用並對此進行測試。
例如,重構代碼以允許您在某些時候注入模擬實現。 有很多方法可以做到這一點。 例如,創建一個getUrlAsString()並模擬它。 (也在上面提出)。 或者創建一個返回GetMethod對象的url getter工廠。 然后工廠可以被嘲笑。
2.作為測試的一部分啟動應用服務器,然后針對它運行您的方法。 (這將是更多的集成測試)
這可以通過多種方式實現。 這可以在測試外部,例如maven jetty插件。 或者測試可以以編程方式啟動服務器。 請參閱: http : //docs.codehaus.org/display/JETTY/Embedding+Jetty
通過https運行會使這變得復雜,但仍然可以使用自簽名證書。 但我會問自己 - 你究竟要測試什么? 我懷疑你確實需要測試https功能,它是一種經過驗證的技術。
我個人會選擇選項1 - 您正在嘗試測試外部庫的功能。 這通常是不必要的。 將依賴項抽象到外部庫也是一種很好的做法。
希望這可以幫助。
如果您正在編寫單元測試,則不需要任何外部依賴項。 來自api,
GetMethod
擴展
HttpMethod
所以你可以用你最喜歡的模擬庫輕松地模擬它。 您的
method.getResponseBodyAsString()
可以模擬調用以返回您想要的任何數據。
看看JWebUnit http://jwebunit.sourceforge.net/
這是一個測試的例子......它非常直觀。
public class ExampleWebTestCase extends WebTestCase {
public void setUp() {
super.setUp();
setBaseUrl("http://localhost:8080/test");
}
public void test1() {
beginAt("/home");
clickLink("login");
assertTitleEquals("Login");
setTextField("username", "test");
setTextField("password", "test123");
submit();
assertTitleEquals("Welcome, test!");
}
}
您可以隨時啟動thttpd
服務器作為單元測試的一部分,以在本地提供請求。 雖然理想情況下,你有一個經過良好測試的GetMethod
,然后你可以模擬它,而不必為你的所有測試實際擁有一個遠程服務器。
資源
您可以將該代碼包裝在某個類中並使用WebClient.getUrl()然后模擬(例如jmock )該方法來返回存儲的文件 - 比如說
expectation {
oneOf("https://someurl/"), will(returnValue(someHTML));
}
你有什么興趣嘲笑這個“Get”調用,因為如果你正在尋找一個通用的Java模擬框架,它與JUnit很好地集成並允許設置在合並到JUnit套件時自動聲明的期望,那么你真的應該看看jMock 。
現在沒有更多的代碼,很難確定這是否真的是你正在尋找的,但是一個(有點無用的)例子,類似於你編寫的示例代碼,將會是這樣的:
class GetMethodTest {
@Rule public JUnitRuleMockery context = new JunitRuleMockery();
@Test
public void testGetMethod() throws Exception {
// Setup mocked object with expectations
final GetMethod method = context.mock(GetMethod.class);
context.checking(new Expectations() {{
oneOf (method).getResponseBodyAsString();
will(returnValue("Response text goes here"));
}});
// Now do the checking against mocked object
String content = method.getResponseBodyAsString();
}
}
使用xml模仿存根服務器,它可以根據請求參數,標題等模擬靜態http響應。配置和使用它非常簡單。
http://xmlmimic.sourceforge.net/ http://sourceforge.net/projects/xmlmimic/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.