2011-09-06 26 views
0

林不知道怎樣來寫我想要做一個接口的模擬對象,所以我提前Java單元測試的創建,做一些工作

我目前正在寫單元測試的一些遺留道歉代碼作爲我工作的一部分。其中一個代碼是一個(Java)HttpServlet,它提供了一個重定向URL。本質上代碼如下所示:

public class Server extends HttpServlet { 
    ... 
    public void doGet(HttpServletRequest request, HttpServletResponse response) { 
    ... 
    String url = "...."; 
    .. // do some work to create that url 
    response.sendRedirect(url); 
    } 
    ... 
} 

作爲我的這個類的單元測試的一部分,我想測試創建的重定向URL。所以我會做一些沿線:

Server server = new Server(); 
.. 
server.doGet(request, response); 
String url = getRedirectURL(response); 
// test URL returned 
... 

什麼是從響應'getRedirectURL'的最佳方式是什麼?

我目前使用JunitJmock(兩個最新版本)。我創建了一個Mock HttpServletRequest,我可以輕鬆創建一個模擬HttpServletResponse,並添加對sendRedirect(url)方法的期望,如果我知道URL的預期格式,但是我不知道。

我的嘗試是創建一個模擬類,實現HttpServletResponse,它存儲了url的值,然後讓我稍後檢索它。即

private class MockHttpServletResponse implements HttpServletResponse { 
    String url; 
    public String getURL() { 
    return url; 
    } 
    public void sendRedirect(String url) { 
    this.url = url; 
    } 
} 

然而,因爲它實現了一個接口的Java希望我實現所有的HttpServletResponse的,我真的不想做的方法。

預先感謝您:)我要試着重新字這

+0

如果你使用JMock,你只需要實現被調用的方法。有關示例,請參閱JMock文檔。 –

+0

嗨喬希,你想要測試的反應是什麼?如果你不知道或不關心URL的內容,那麼僅僅測試它不是null就足夠了。 –

+0

我關心網址是什麼,這是令人討厭的事情。 我可以測試sendRedirect方法是用一個(非null)字符串調用的:response.sendRedirect(with(a(String.class)));但我想根據返回的URL的值運行測試。 –

回答

1

你需要實現一個自定義的匹配。見Writing New Matchers

定製的匹配器可以讓你準確地測試你想要什麼,但它也可以讓你存儲傳遞到匹配的值,這樣就可以在以後檢索:

從JMock的現場:

import org.hamcrest.AbstractMatcher; 

public class StringStartsWithMatcher extends TypeSafeMatcher<String> { 
    private String prefix; 
    private String calledValue; // ADDED THIS 

    public StringStartsWithMatcher(String prefix) { 
     this.prefix = prefix; 
    } 

    public String getCalledValue() { 
     return calledValue; 
    } 

    public boolean matchesSafely(String s) { 
     this.calledValue = s; // AND HERE 
     return s.startsWith(prefix); 
    } 

    public StringBuffer describeTo(Description description) { 
     return description.appendText("a string starting with ").appendValue(prefix); 
    } 
} 

@Factory 
public static Matcher<String> aStringStartingWith(String prefix) { 
    return new StringStartsWithMatcher(prefix); 
} 

public class MyTestCase { 
    ... 

    public void testSomething() { 
     ... 

     TypeSafeMatcher<String> matcher = aStringStartingWith("http") 

     context.checking(new Expectations() {{ 
      oneOf (logger).error(with(matcher)); 
     }}); 

     // more tests using matcher.getCalledValue() 
     ... 
    } 
} 

所以你存儲calledValue,其中你再通過getCalledValue檢索URL值()。

+0

這真棒:)謝謝:D <3 –

0

我猜你只是想確認的sendRedirect方法的響應模擬調用,只是你不關心什麼價值是。如果是這樣的話,你可以設定一個期望是這樣的:

response.sendRedirect(with(a(String.class))); 
+0

不幸的是我關心的是什麼值:( –

0

鑑於這一切都發生在一個單元測試中,你不能預測URL將會是什麼樣的並且如此匹配嗎?也就是說,通常使用匹配器來提取你所關心的功能是非常有用的,這使得測試更加集中。