1

私のコードは API (www.abc.com/public/news/apple.json) のコンシューマです。代わりに json 配列を取得し、それを解析して独自のデータ構造に入力します。これを行うコードは次のとおりです。

    public Map<String,List<NewsItem>> populateNewsArray() throws Exception
        {
            url = domain + newsApiStr;
            InputStream stream = getNews(url, true);

           //jackson library object mapper
           ObjectMapper mapper = new ObjectMapper();

          //NewsApiObject class implements the structure of the json array returned.
           List<NewsApiObject> mappedData = mapper.readValue(stream, NewsApiObject.class));

           //populate the properties in a HashMap.
          //return HashMap
     }

     public InputStream getNews(String request, boolean bulk) throws Exception
     {
        URL url = new URL(request); 
        connection = (HttpURLConnection) url.openConnection();           
        connection.setDoOutput(true);
        connection.setInstanceFollowRedirects(false);
        connection.setRequestMethod("GET"); 
        connection.setRequestProperty("Content-Type", "text/plain"); 
        connection.setRequestProperty("charset", "utf-8");
        connection.connect();

        return connection.getInputStream();
     }

ご覧のとおり、私は API のコントローラーではなく、コンシューマーです。単体テストでは、http リクエストを行うことは想定されていないと言われています。このシナリオでは、populateNewsArray() 関数を単体テストして、オブジェクト マッピングが (例外なく) 正しく、有効なハッシュマップが返されたかどうかを確認するにはどうすればよいでしょうか?

4

2 に答える 2

1

getNews()NewsReader などの別のインターフェイスに抽出する必要があります (この単語Readerは JDK で特定の意味を持ちますが、私はその名前が気に入っています...)

public interface NewsReader {
    InputStream getNews(String request, boolean bulk) throws Exception
}

次に、コードに従って使用してそのインターフェイスを実装しHttpURLConnection、コードを更新して、その特定のインターフェイスの挿入を許可します。次に、コードが をどのように処理するかをテストする必要がある場合は、既知のコンテンツでを返す のInputStreamモックを作成できます。NewsReaderInputStream

高い凝集度を目指してください。クラスは HTTP クライアントおよびストリーム パーサーであってはなりません。

于 2012-09-26T10:54:36.563 に答える
0

サブクラスを作成し、メソッドを上書きしますgetNews(...)。サブクラスではInputStream、テスト用に を返すことができます。
単体テストでは外部ファイルに依存するべきではないため、テスト可能な設計を改善するために、getNews(...)メソッドを変更して、マッパーによってさらに処理できる何らかの値を返すようにします。

于 2012-09-26T10:28:18.743 に答える