2

How to mock the HttpURLConnection to the getContent() method in the sample code , Also how to get the reponse from the mock url

public class WebClient {
   public String getContent(URL url) {
       StringBuffer content = new StringBuffer();
       try {

           HttpURLConnection connection = createHttpURLConnection(url);
           connection.setDoInput(true);
           InputStream is = connection.getInputStream();
           int count;
           while (-1 != (count = is.read())) {
               content.append(new String(Character.toChars(count)));
           }
       } catch (IOException e) {
           return null;
       }
       return content.toString();
   }
   protected HttpURLConnection createHttpURLConnection(URL url) throws IOException{
       return (HttpURLConnection)url.openConnection();

   } 
}

Thanks

4

3 回答 3

2

Webclient的测试设计有点糟糕。您应该避免隐藏的依赖项(基本上是大多数new操作)。为了可模拟,这些依赖项应该(最好)在它的构造函数中提供给被测对象,或者被测对象应该将它们保存在一个字段中,以便它们可以被注入。

或者,您可以像这样扩展您的 Webclient

new Webclient() {
  @Override
  HttpURLConnection createHttpURLConnection(URL url) throws IOException{
    return getMockOfURLConnection();
}

wheregetMockOfURLConnection从 Mockito 等模拟框架返回 HttpURLConnection 的模拟。然后你教那个模拟返回你想要的并verify用来检查它是否被正确调用。

于 2012-09-06T07:50:45.833 回答
2

您应该重构您的代码:使用方法URL.openStream()而不是这种转换为HttpURLConnection. 代码将更简单、更通用且更易于测试。

public class WebClient {
    public String getContent(final URL url) {
        final StringBuffer content = new StringBuffer();
        try {
            final InputStream is = url.openStream();
            int count;
            while (-1 != (count = is.read()))
                content.append(new String(Character.toChars(count)));
        } catch (final IOException e) {
            return null;
        }
        return content.toString();
    }
}

然后,你应该模拟URL. 这是最后一堂课,所以你不能用 Mockito 模拟它。它仍然有几种可能性,按优先顺序排列:

  1. 使用类路径中的假资源进行测试并WebClientTest.class.getResource("fakeResource")用于获取URL.
  2. 提取一个接口StreamProvider,允许InputStreamURL您的WebClient.
  3. 使用PowerMock模拟final class URL.
于 2012-09-06T07:58:54.600 回答
0

你需要为此使用存根,看看 mockito.org,它是一个易于使用的框架。这个想法是模仿类的行为并验证您的代码是否处理正面和负面的情况。

于 2012-09-06T07:42:54.027 回答