簡體   English   中英

在java中模擬https請求

[英]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 ,然后你可以模擬它,而不必為你的所有測試實際擁有一個遠程服務器。

資源

  • thttpd: http ://www.acme.com/software/thttpd/

您可以將該代碼包裝在某個類中並使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM