web-dev-qa-db-ja.com

安静なWebサービスをスタブ/ダミーする簡単な方法は何ですか?

Android=アプリケーションを作成します。このアプリケーションは、WebサービスをRESTfulに呼び出してデータを取得します。

RESTfulインターフェースがどうなるかはわかっていますが、独自の実装を作成する手間をかけたくありません。これを行うために本格的なWSアプリケーションを作成する必要なく、静的データを返すスタブRESTful Webサービスを簡単に作成する方法はありますか?

27
Jimmy

おそらく最善の方法は、アプリケーションコードの開発中にREST Webサービスサービスのモックを作成し、それをコードに置き換えて、実際のWebサービスを呼び出して「実際の」データを返すことです。 、アプリケーションが作成されたら。

私は現在、RESTful Webアプリケーションからデータを取得する、非常に類似したアプリケーションを作成しています。私のアプリケーションでは、GWTが推奨する [〜#〜] mvp [〜#〜] パターンに従い、Martin Fowlerが PassiveView パターンとして文書化しています。

REST Webサービスをインターフェイス(モデル)に呼び出すためのコードを抽象化します。このモデルクラスの責任は、Presenter/Controllerにデータを提供することです。 Presenterはすべてのビジネスロジックを処理してから、データをビューに渡します(ビューはかなり単純であるだけでなく、モックアウトすることもできます)。テスト中に、MockModelを作成してモデルインターフェイスを実装し、 Presenterへのデータのテスト-実際のWebサービス呼び出しをまったく行わずに!次に、準備ができたら、このクラスを実際のWebサービスに置き換えて、統合テストを開始します。

このアプローチには、モックモデルで特定の(繰り返し可能な)テストケースを簡単に作成できるという追加の利点があります。実際のWebサービスを制御できない場合(そして私がそうではないと想定している場合)、これを達成するのは(または不可能にさえ)困難な場合があります。結果として、テスト用のXMLやJSONを作成したり、Webサービスを自分で作成したりする必要がなく、より堅牢でテストされたアプリケーションになるはずです。

0
Vinnie

Mocky.io を使用すると、スタブエンドポイントを作成し、パブリックURLを介してそれらが返すデータを指定できます。

Runscope(免責事項、私は創設者です)を使用すると、実際のリクエストを1回取得し、必要に応じて Response Playback URLsを介して応答を再生できます。

14
John Sheehan

実際のHTTP呼び出しコードをテストする場合、この種のことには Sinatra を使用すると本当に便利です。数秒でデータを返すエンドポイントを持つことができます。非常に少ないRuby知識が必要です。

require 'sinatra'
require 'json'

get '/Person' do
    content_type :json
    { :id => 345, :key2 => 'John Doe' }.to_json
end

単純なjsonオブジェクトを返すために必要なのはこれだけです。

9
breathingdust

アプローチの1つ(Vinnieと同様)は、Webサービスのローカル実装を作成することです。たとえば、Webサービスでは、ユーザーをログインさせたり、ユーザーのリストをオンラインで取得したりできます。

Webサービスインターフェイスは次のようになります。

public interface WebService {
    public LoginResponse login(String user, String pass) throws Exception;
    public UsersOnlineResponse getOnlineUsers() throws Exception;
}

次に、本番環境で使用されるリモートWebサービスのこのインターフェースを実装します。リモート実装は、HTTPクライアントの助けを借りてHTTP呼び出しを行い、応答を取得して、適切な応答オブジェクトに解析します。以下がその断片です:

public class RemoteWebService implements WebService {
    private AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT);

    @Override
    public LoginResponse login(String user, String pass) throws Exception {
        LoginResponse response = client.execute(
            createPostRequest(METHOD_LOGIN, user, pass), 
            new JsonResponseHandler(LoginResponse.class));

        handleResponse(response); // verify response, throw exceptions if needed
        return response;
    }
}

テストの目的で、Webサービスが利用できない場合や開発中の場合は、ローカルWebサービスを実装します。ローカル実装は、アセットフォルダーから事前定義されたJSON応答を受け取り、それを適切な応答オブジェクトに解析します。 Webサービスの動作を実装する方法は、あなた次第です。単純な静的応答でも、ランダム/検証依存の応答でもかまいません。以下がその一部です。

public class LocalWebService implements WebService {
    private Context context;

    public LocalWebService(Context context) {
        this.context = context;
    }

    @Override
    public LoginResponse login(String user, String pass) throws Exception {
        Thread.sleep(DELAY); //emulate network delay

        if (validateParams(user, pass)) {
            return parseAssetsJson("ws/login.json", LoginResponse.class);
        } else {
            Response response = parseAssetsJson("ws/status_bad_request.json", Response.class);
            throw new WebServiceException(response);
        }
    }

    public <T> T parseAssetsJson(String filename, Class<T> klass) throws IOException {
        InputStream is = context.getAssets().open(filename);
        return JsonParser.getInstance().fromJson(new InputStreamReader(is), klass);
    }
}

次に、実装を簡単に切り替える必要があります。 WebServiceインターフェイスを使用するため、Webサービスの両方の実装の使用は透過的です。したがって、アプリの起動時にWebServiceインスタンスを構成します。 Application クラスは私たちのニーズに合っています:

public class App extends Application {
    public static final boolean USE_LOCAL_WS = false;
    private static WebService webService;

    public static getWebService() {
        return webService;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        webService = USE_LOCAL_WS ? new LocalWebService(this) : new RemoteWebService();
    }
}
5
vokilam

WireMockをチェックすることをお勧めします(免責事項-私が作成しました): http://wiremock.org/

ラップトップでスタンドアロンで実行し、スタブ化された応答を構成して、アプリが期待どおりのリクエストを送信することを確認できます。

流暢なJava APIまたはJSON(ファイルまたはHTTP経由))を介して構成可能です。

3
Tom

Beeceptor (免責事項、私は作成者です)は、ここでの正確なユースケースを支援します。 APIエンドポイントを作成し、モックパスと応答を定義します。ハッカソンで使用して、数秒でモックAPIを作成できます。

Beeceptorはあざけるサービス以上のものです。 APIのHTTPプロキシです。たとえば、実際のAPIがある場合は、実際のAPIを最終的なターゲットとして使用します。 Beecetorはトラフィックを傍受し、ルールを使用して、

  • ルールが一致すると、APIはモックされます
  • 一致するルールがない場合、ターゲットエンドポイントは通常どおりヒットします。

Mocky.ioでは、異なるAPIパスを使用する必要があります。Beeceptorを使用すると、ベースURLは常に同じになります。

1
ankitjaininfo

私は同様の目的でモックサービスツールを作成してしまいました: https://github.com/clafonta/Mockey/wiki

モックサービスは、UIをすばやく構築してクライアントコードを検証するための優れたツールですが、うさぎの穴になる可能性があるため、独自のものを構築する前に、すでに存在するものを使用することをお勧めします。 「モック」を検索すると、Githubには多くの結果が表示されます。あなたが何をしているかに関係なく、ここにあなたが遭遇するかもしれないいくつかの重要な障害があります。

  • 誤ったデータ/ JSON形式で作業することになります。たとえば、アプリはモックサービスで適切に機能しますが、実際のサービスにアクセスすると中断します。アプリはJSONオブジェクトを使用しますが、実際のサービスはJSONオブジェクトの配列を返します。これを回避するには、JSONスキーマを使用して、モックサービスで無効なJSONモデルを強調表示することをお勧めします。

  • アプリは有効なリクエストを行いません。モックサービスは通常、着信リクエストを気にしません。たとえば、実際のサービスには「customerID」が必要であり、アプリはそれを渡しません。これを回避するには、モックサービスに「必須のリクエストパラメータ」検証ロジックを構築します。

  • テストの課題。単純な「ハッピーパス」を超えてテストする場合は、自動機能テストアプローチがモックサービスツールと対話する必要があります。たとえば、「user Aがログインして0メッセージが表示される」というテストを実行すると、「user Bがログインして20メッセージが表示される "。

1
clafonta

Jadler( http://jadler.net )を試すことができます。これは、私がしばらく取り組んできたhttp stubbing/mockingライブラリです。それは私が信じているあなたのすべての要件を満たすはずです。

1
Jan Dudek

Atmo が役に立つかもしれません。

免責事項:私はatmoの作者です。

0
Raathigesh

誰かがこのスレッドをyear >= 2017でまだ見ている場合に備えて。ボックスに何かをインストールしたりデプロイしたりする必要なしに、モック石鹸を作成してWebサービスを数秒で休める無料のツールがあります。

amock.io

HTTPメソッド、応答コード、応答メッセージ本文、コンテンツタイプを選択したり、カスタムエンドポイントを指定したりできます。

これは、リモートWebサービスからアプリ(あらゆる種類のアプリ)にモックデータを返す場合に非常に役立ちます。

免責事項、私は必然的にこのサービスを開発し、他の人がソリューションから利益を得ることができるように無料にしました。

0
k32y

ダミーの応答を含むファイルをいくつか作成し、フォルダーに入れます。次に、コマンドラインに移動して、以下を実行します。python -m SimpleHTTPServer

これらのファイルとダミー応答にhttp://:8000でアクセスできるようになりました。

0
Amol Gupta

私はFakeRest( https://github.com/marmelab/FakeRest )を見てみることをお勧めします。これは、XMLHTTPRequestモンキーパッチを使用するクライアント側のみのFakeサーバーです。

免責事項:私はそれを書きました。

0