3

離れた HTTP サーバーと通信する必要がある Swing アプリケーションを開発しています。そのアプリケーションは、プロキシの背後で使用される可能性があります。

次に、次のことを行う必要があります。 - ネットワーク プロキシ (同じネットワーク上に複数存在する可能性があります) を自動的に検出します。 - ユーザーがプロキシ構成を手動で入力できるようにします。

すべての CI マシンとすべての開発者マシンにプロキシをインストールすることなく、これらの側面を検証するための統合テストを作成したいと考えています。物事の見方 :

  • 統合テスト (junit を使用) は、「組み込み」プロキシ (@BeforeClass) とややダミーの http サーバーを開始します。
  • 私のテスト (@Test)
    • このプロキシが自動的に検出されることをテストし、ダミーの http サーバーへの接続を開き、そこからデータを正常に取得します
    • 手動でプロキシを設定し、上記と同じテストを実行します

「littleProxy」コンポーネントについて聞いたことがありますが、まだ試していません。

私の問題を解決するための最良のアプローチに関して、誰かがアドバイス/ヘルプ/ガイダンスを提供できますか?

4

1 に答える 1

2

あなたが正しいことをテストしているかどうかを検討します。プロキシ サーバーや Java のネットワーク クラスをテストする必要はありません。

URL からデータを読み取るための次のユーティリティ タイプを検討してください。

public final class Network {
    public interface UrlOpener {
        public InputStream open(URL url) throws IOException;
    }

    private static UrlOpener urlOpener = new UrlOpener() {
        public InputStream open(URL url) throws IOException {
            return url.openStream();
        }
    };

    public static InputStream openUrl(URL url) throws IOException {
        return urlOpener.open(url);
    }

    public static void setUrlOpener(UrlOpener urlOpener) {
        Network.urlOpener = urlOpener;
    }
}

これは、コードと Java のネットワーク I/O の間の抽象化レイヤーとして使用できます。

public class SomeType {
    public void processData(URL url) throws IOException {
        InputStream input = Network.openUrl(url);
        // process the data
    }
}

テストでは、このレイヤーを使用してデータをモックアウトします。

@Before public void setup() throws IOException {
    final URL mockUrl = this.getClass().getResource("/foo/bar.txt");
    Network.UrlOpener opener = Mockito.mock(Network.UrlOpener.class);
    Answer<InputStream> substituteUrl = new Answer<InputStream>() {
        public InputStream answer(InvocationOnMock invocation) throws Throwable {
            return mockUrl.openStream();
        }
    };
    Mockito.when(opener.open(Mockito.any(URL.class))).then(substituteUrl);
    Network.setUrlOpener(opener);
}

@Test public void testSomething() throws IOException {
    SomeType something = new SomeType();
    something.processData(new URL("http://example.com"));
}

これにより、ファイアウォールなどをいじる必要がなくなります。

このアプローチを機能させるには、実際のサーバーから記録された一連のトランザクションを信頼してテストに使用する必要があります。

このアプローチは、より包括的な統合テストを実行する専用マシンで補完できます。

于 2012-12-14T15:44:29.237 に答える