Androidアプリケーションを作成したいのですが、このアプリケーションはWebサービスに対してRESTful呼び出しを行い、データを取得します。
RESTfulインターフェースがどうなるかは知っていますが、独自の実装を作成する手間をかけたくありません。これを行うために本格的なWSアプリケーションを作成しなくても、静的データを返すスタブRESTful Webサービスを作成する簡単な方法はありますか?
Androidアプリケーションを作成したいのですが、このアプリケーションはWebサービスに対してRESTful呼び出しを行い、データを取得します。
RESTfulインターフェースがどうなるかは知っていますが、独自の実装を作成する手間をかけたくありません。これを行うために本格的なWSアプリケーションを作成しなくても、静的データを返すスタブRESTful Webサービスを作成する簡単な方法はありますか?
実際のHTTP呼び出しコードをテストする場合は、Sinatraを使用するとこの種のことが非常に役立つことがわかりました。エンドポイントが数秒でデータを返すようにすることができます。Rubyの知識はほとんど必要ありません。
require 'sinatra'
require 'json'
get '/Person' do
content_type :json
{ :id => 345, :key2 => 'John Doe' }.to_json
end
単純なjsonオブジェクトを返すために必要なのはこれだけです。
アプローチの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インスタンスを構成します。アプリケーションクラスは私たちのニーズに合っています:
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();
}
}
WireMockをチェックすることをお勧めします(免責事項-私はそれを書きました): http ://wiremock.org/
ラップトップでスタンドアロンで実行し、スタブ応答を構成して、アプリが期待したリクエストを送信することを確認できます。
流暢なJavaAPIまたはJSON(ファイルまたはHTTP経由)を介して構成できます。
私は同じような目的で模擬サービスツールを書くことになりました:https ://github.com/clafonta/Mockey/wiki
モックサービスは、UIをすばやく構築し、クライアントコードを検証するための優れたツールですが、うさぎの穴になる可能性があるため、独自のサービスを構築する前に、すでに存在するものを使用することをお勧めします。'mock'を検索すると、Githubにはたくさんの結果が表示されます。あなたが何をするかに関係なく、ここにあなたが遭遇するかもしれないいくつかの重要なつまずきのブロックがあります。
間違ったデータ/JSON形式で作業することになります。たとえば、アプリはモックサービスでうまく機能しますが、アプリはJSONオブジェクトを消費しますが、実際のサービスはJSONオブジェクトの配列を返すため、実際のサービスにアクセスすると機能しなくなります。これを回避するには、JSONスキーマを使用して、モックサービスで無効なJSONモデルを強調表示することをお勧めします。
アプリは有効なリクエストを行いません。模擬サービスは通常、着信要求を気にしません。たとえば、実際のサービスには「customerID」が必要であり、アプリがそれを渡すことはありません。これを回避するには、モックサービスに「必須のリクエストパラメーター」検証ロジックを構築できます。
テストの課題。単純な「ハッピーパス」を超えて物事をテストしたい場合は、自動化された機能テストアプローチがモックサービスツールと相互作用する必要があります。たとえば、「ユーザーAがログインして0個のメッセージが表示される」と「ユーザーBがログインして20個のメッセージが表示される」というテストを実行します。
Jadler(http://jadler.net)を試すことができます。これは、私が以前から取り組んできたhttpスタブ/モックライブラリです。それは私が信じるあなたのすべての要件を満たすはずです。
誰かがまだこのスレッドを見ている場合に備えてyear >= 2017
。ボックスに何かをインストールしたりデプロイしたりすることなく、モックソープを作成してWebサービスを数秒で停止できる無料のツールがあります。
httpメソッド、応答コード、応答メッセージ本文、コンテンツタイプの選択、カスタムエンドポイントの指定などを選択できます。
これは、リモートWebサービスからアプリ(あらゆる種類のアプリ)にモックデータを返す場合に非常に便利です。
免責事項、私は必然的にこのサービスを開発し、他の人がソリューションから利益を得ることができるように無料にしました。
Beeceptor(免責事項、私は著者です)は、ここでの正確なユースケースを支援します。APIエンドポイントを作成し、モックパスと応答を定義します。ハッカソンで使用して、モックAPIを数秒で構築します。
Beeceptorは単なるモックサービスではありません。API用のHTTPプロキシです。たとえば、実際のAPIがある場合は、実際のAPIを最終的なターゲットとして使用します。Beecetorはトラフィックを傍受し、ルールを使用して、
Mocky.ioを使用すると、さまざまなAPIパスが必要になります。Beeceptorを使用すると、ベースURLは常に同じになります。
QuickMockerと呼ばれる非常に新しいモックAPIソリューションがあり、静的データをスタブ化するだけでなく、ショートコードを使用して偽の(偽物の)ランダムなコンテキストデータを生成することもできます。複数のHTTPメソッドとRegExpURLパスをサポートしているため、必要なものをすべて傍受できる単一のダミーエンドポイントを1つでも作成できます。そして、ええ、それはあなたの偽のAPIドメインに対してなされたどんな要求もデバッグすることを可能にします。
おそらく最善の方法は、アプリケーションコードの開発中に、REST Webサービスサービスのモックを作成し、それをコードに置き換えて、アプリケーションが作成されたら、実際のWebサービスを呼び出して「実際の」データを返すことです。
私は現在、RESTful Webアプリケーションからデータを取得する(あなたのような)あなたと非常によく似たアプリケーションを書いています。私のアプリケーションでは、GWTが推奨するMVPパターンに従っており、MartinFowlerによってPassiveViewパターンとしても文書化されています。
あなたがしたいのは、コードを抽象化して、REST Webサービス呼び出しをインターフェース(モデル)にすることです。このモデルクラスの責任は、プレゼンター/コントローラーにデータを提供することです。プレゼンターはすべてのビジネスロジックを処理してから、データをビューに渡します(ビューはかなりダムである必要があり、モックアウトも可能です)。テスト中に、MockModelを作成してモデルインターフェイスを実装し、実際のWebサービス呼び出しをまったく行わずにテストデータをプレゼンターに渡します。次に、準備ができたら、このクラスを実際のWebサービスに置き換えて、統合テストを開始します。
このアプローチには、モックモデルで特定の(そして繰り返し可能な)テストケースを簡単に作成できるという追加の利点があります。実際のWebサービスを制御できない場合(そして、制御できないと思います)、これを実現するのは困難(または不可能)になる可能性があります。その結果、テストXMLやJSONを作成したり、Webサービスを自分で作成したりすることなく、より堅牢で、より適切にテストされたアプリケーションになるはずです。
ダミーの応答を含むいくつかのファイルを作成し、フォルダーに入れます。次に、コマンドラインに移動して、次を実行します。python -m SimpleHTTPServer
これらのファイルとダミーの応答にhttp://:8000でアクセスできるようになりました
XMLHTTPRequestモンキーパッチを使用するクライアント側のみのFakeServerであるFakeRest(https://github.com/marmelab/FakeRest )を確認することをお勧めします。
免責事項:私はそれを書きました。
Atmoが役立つかもしれません。
免責事項:私はatmoの作者です。
http://maqueapp.com/を利用して、模擬Webサービスを作成できます。その迅速かつ簡単。フレックスショーエピソード157で聞いた(フレックスショーではない!)