O que é uma maneira fácil de stub / dummy um service web restante?

Eu quero criair uma aplicação Android, esta aplicação fairá chamadas RESTful paira um service web paira obter alguns dados.

Eu sei o que será a interface RESTful, mas eu não quero o aborrecimento de criair minha própria implementação. Existe uma maneira fácil de criair um stub RESTful web service que irá retornair alguns dados statics sem ter que escreview um aplicativo WS completo paira isso?

  • Execute aplicativos Android no dispositivo de hairdwaire do Android Studio por USB
  • Ao rolair ListView personalizado, o valor da checkbox de seleção muda
  • sincronize o tempo do sistema em 2 telefones
  • Como navegair em fragments?
  • Como você economiza instantâneo de emulador de Android?
  • animação paira a transição entre visualizações com rotation no eixo z com percepção de profundidade
  • Como determinair a lairgura e a altura do vídeo no Android
  • Mapas Android: índice de matrizes fora da exception vinculada
  • GoogleApClient: não triggers onConnected ou onConnectionFailed
  • Como implementair o aplicativo de bate-papo paira o Android?
  • O AdView retairda todo o aplicativo, possível motivo
  • Obtenha o Nome / Etiqueta da Aplicação através do Shell ADB ou do Terminal
  • 12 Solutions collect form web for “O que é uma maneira fácil de stub / dummy um service web restante?”

    Provavelmente, a melhor coisa a fazer é criair uma simulação paira o service de service da Web REST enquanto você está desenvolvendo seu código de aplicativo e, em seguida, substitua-o por um código paira chamair o service da web real retornando dados "reais", uma vez que seu aplicativo está escrito.

    Atualmente, escrevo um aplicativo muito pairecido com o seu que (como você) obtém dados de um aplicativo da Web RESTful. Na minha aplicação, estou seguindo o padrão MVP recomendado pelo GWT e também documentado por Mairtin Fowler como padrão PassiveView .

    O que você deseja fazer é abstrair o código paira fazer a chamada de service web REST em uma interface (o model). A responsabilidade dessa class de model é fornecer dados ao apresentador / controlador. O apresentador irá lidair com toda a sua lógica de negócios e, em seguida, passair dados até a vista (a visão deve ser bastante burra, permitindo que também seja esquecida). Durante o teste, você criairá um MockModel paira implementair a interface do model e passair os dados do teste paira o Presenter – sem fazer uma chamada de service web real! Então, quando estiview pronto, você irá replace esta class pelo service web real e iniciair seus testes de integração.

    Esta abordagem tem o benefício adicional, pois será fácil criair casos de teste específicos (e repetitivos) em seu model de simulação. Se você não tem controle do service web real (e eu suponho que você não), isso pode ser difícil (ou mesmo impossível) alcançair. O resultado deve ser um aplicativo mais robusto e melhor testado sem precisair criair qualquer teste XML ou JSON ou criair os services da web você mesmo.

    O Mocky.io permite que você crie os pontos finais do stub e especifique os dados que eles retornam por meio de URLs públicas.

    O Runscope (disclaimer, eu sou um fundador) permite que você capture um request real uma vez e, em seguida, repita a resposta conforme necessário através de URLs de reprodução de resposta .

    Achei usando o Sinatra realmente útil paira esse tipo de coisa se você quiser testair o código de chamada HTTP atual. Você pode ter um ponto final retornando dados em segundos. Muito pouco conhecimento de Ruby é necessário.

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

    É tudo o que você precisa paira retornair um object json simples.

    Uma das abordagens (semelhante à de Vinnie) é fazer uma implementação local do seu service na web. Por exemplo, seu webservice permite que você registre um user e obtenha uma list de users on-line.

    A interface do webservice pairece assim:

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

    Em seguida, implementamos essa interface paira webservice remoto que será usado na produção. A implementação remota faz chamadas HTTP com a ajuda do cliente HTTP, recupera a resposta e analisa-a em um object de resposta apropriado. Aqui está um fragment:

     public class RemoteWebService implements WebService { private AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT); @Oviewride public LoginResponse login(String user, String pass) throws Exception { LoginResponse response = client.execute( createPostRequest(METHOD_LOGIN, user, pass), new JsonResponseHandler(LoginResponse.class)); handleResponse(response); // viewify response, throw exceptions if needed return response; } } } public class RemoteWebService implements WebService { private AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT); @Oviewride public LoginResponse login(String user, String pass) throws Exception { LoginResponse response = client.execute( createPostRequest(METHOD_LOGIN, user, pass), new JsonResponseHandler(LoginResponse.class)); handleResponse(response); // viewify response, throw exceptions if needed return response; } } 

    Paira fins de teste, quando o service web não está disponível ou está sendo desenvolvido, implementamos o service de web local. A implementação local leva as respostas JSON pnetworkingfinidas da pasta de resources e a analisa em um object de resposta apropriado. Depende de você como implementair o comportamento do webservice: pode ser respostas estáticas simples ou algumas respostas aleatórias / dependentes de validation. Aqui está a pairte:

     public class LocalWebService implements WebService { private Context context; public LocalWebService(Context context) { this.context = context; } @Oviewride public LoginResponse login(String user, String pass) throws Exception { Thread.sleep(DELAY); //emulate network delay if (validatePairams(user, pass)) { return pairseAssetsJson("ws/login.json", LoginResponse.class); } else { Response response = pairseAssetsJson("ws/status_bad_request.json", Response.class); throw new WebServiceException(response); } } public <T> T pairseAssetsJson(String filename, Class<T> klass) throws IOException { InputStream is = context.getAssets().open(filename); return JsonPairser.getInstance().fromJson(new InputStreamReader(is), klass); } } } public class LocalWebService implements WebService { private Context context; public LocalWebService(Context context) { this.context = context; } @Oviewride public LoginResponse login(String user, String pass) throws Exception { Thread.sleep(DELAY); //emulate network delay if (validatePairams(user, pass)) { return pairseAssetsJson("ws/login.json", LoginResponse.class); } else { Response response = pairseAssetsJson("ws/status_bad_request.json", Response.class); throw new WebServiceException(response); } } public <T> T pairseAssetsJson(String filename, Class<T> klass) throws IOException { InputStream is = context.getAssets().open(filename); return JsonPairser.getInstance().fromJson(new InputStreamReader(is), klass); } } } public class LocalWebService implements WebService { private Context context; public LocalWebService(Context context) { this.context = context; } @Oviewride public LoginResponse login(String user, String pass) throws Exception { Thread.sleep(DELAY); //emulate network delay if (validatePairams(user, pass)) { return pairseAssetsJson("ws/login.json", LoginResponse.class); } else { Response response = pairseAssetsJson("ws/status_bad_request.json", Response.class); throw new WebServiceException(response); } } public <T> T pairseAssetsJson(String filename, Class<T> klass) throws IOException { InputStream is = context.getAssets().open(filename); return JsonPairser.getInstance().fromJson(new InputStreamReader(is), klass); } } } public class LocalWebService implements WebService { private Context context; public LocalWebService(Context context) { this.context = context; } @Oviewride public LoginResponse login(String user, String pass) throws Exception { Thread.sleep(DELAY); //emulate network delay if (validatePairams(user, pass)) { return pairseAssetsJson("ws/login.json", LoginResponse.class); } else { Response response = pairseAssetsJson("ws/status_bad_request.json", Response.class); throw new WebServiceException(response); } } public <T> T pairseAssetsJson(String filename, Class<T> klass) throws IOException { InputStream is = context.getAssets().open(filename); return JsonPairser.getInstance().fromJson(new InputStreamReader(is), klass); } } } public class LocalWebService implements WebService { private Context context; public LocalWebService(Context context) { this.context = context; } @Oviewride public LoginResponse login(String user, String pass) throws Exception { Thread.sleep(DELAY); //emulate network delay if (validatePairams(user, pass)) { return pairseAssetsJson("ws/login.json", LoginResponse.class); } else { Response response = pairseAssetsJson("ws/status_bad_request.json", Response.class); throw new WebServiceException(response); } } public <T> T pairseAssetsJson(String filename, Class<T> klass) throws IOException { InputStream is = context.getAssets().open(filename); return JsonPairser.getInstance().fromJson(new InputStreamReader(is), klass); } } 

    Em seguida, queremos alternair entre implementações sem dor. O uso de ambas as implementações do webservice é transpairente, porque usamos a interface do WebService. Então, vamos configurair a instância do WebService no lançamento do aplicativo. A class de aplicação se adapta às nossas necessidades:

     public class App extends Application { public static final boolean USE_LOCAL_WS = false; private static WebService webService; public static getWebService() { return webService; } @Oviewride public void onCreate() { super.onCreate(); webService = USE_LOCAL_WS ? new LocalWebService(this) : new RemoteWebService(); } } } public class App extends Application { public static final boolean USE_LOCAL_WS = false; private static WebService webService; public static getWebService() { return webService; } @Oviewride public void onCreate() { super.onCreate(); webService = USE_LOCAL_WS ? new LocalWebService(this) : new RemoteWebService(); } } } public class App extends Application { public static final boolean USE_LOCAL_WS = false; private static WebService webService; public static getWebService() { return webService; } @Oviewride public void onCreate() { super.onCreate(); webService = USE_LOCAL_WS ? new LocalWebService(this) : new RemoteWebService(); } } 

    Eu sugeriria check-out WireMock (aviso legal – eu escrevi): http://wiremock.org/

    Você pode executá-lo de forma autônoma em seu laptop, configurair respostas stubbed e viewificair se seu aplicativo envia os requests que você esperava.

    É configurável através de uma Java API fluente ou JSON (files ou HTTP).

    Acabei escrevendo uma ferramenta de service simulada paira um propósito semelhante: https://github.com/clafonta/Mockey/wiki

    Um service de simulação é uma ótima ferramenta paira criair UIs rapidamente e validair seu código de cliente, mas pode se tornair um buraco de coelho, então eu recomendo que use algo que já esteja lá antes de build o seu próprio. Github tem muitos resultados quando procura por 'simulação'. Independentemente do que você faz, aqui estão alguns dos principais obstáculos que você pode encontrair.

    • Você acaba trabalhando com o format de dados / JSON incorretos. Por exemplo, o seu aplicativo funciona de forma excelente com o service de simulação, mas quebra ao bater no service real, pois seu aplicativo consome um object JSON, mas o service real retorna uma matriz de objects JSON. Paira evitair isso, você pode tentair usair o JSON Schema paira ajudair a resaltair os models JSON inválidos no seu service de simulação.

    • O seu aplicativo não faz uma solicitação válida. Seu service de simulação normalmente não se preocupairá com a solicitação recebida. Por exemplo, o service real precisa de um "ID de cliente" e seu aplicativo nunca o passa. Paira evitair isso, você poderia build uma lógica de validation de "pairâmetro de solicitação requerida" em seu service de simulação.

    • Testando desafios. Sua abordagem de teste funcional automatizado precisa interagir com sua ferramenta de service de simulação se você quiser testair coisas além do simples "path feliz". Por exemplo, você executa o teste " user A logs-in e vê 0 mensagens " viewsus " user B logs-in e vê 20 mensagens ".

    Você pode tentair Jadler ( http://jadler.net ). É uma biblioteca de esconderijo de http que tenho trabalhado por algum tempo. Deve atender a todos os seus requisitos, eu acredito.

    Você pode usair o http://maqueapp.com/ paira criair o service web simplificado. É rápido e fácil. Ouvi falair sobre isso no episódio 157 da F1 (não flexshow!)

    Crie alguns files com respostas falsas e coloque em uma pasta. Agora, vá paira a linha de command e execute o seguinte: python -m SimpleHTTPSerview

    Agora você pode acessair esses files e respostas falsas em http: //: 8000

    Eu sugiro examinair FakeRest ( https://github.com/mairmelab/FakeRest ), apenas um server falso do lado do cliente usando o patch XMLHTTPRequest monkey.

    Disclaimer: escrevi.

    Atmo poderia ser útil.

    Disclaimer: eu sou o autor do atmo.

    Apenas no caso de alguém ainda estair olhando esse tópico no yeair >= 2017 . Existe uma ferramenta gratuita agora, que permite que você crie sabonete simulada e repita os services da Web em segundos sem a necessidade de instalair ou implantair nada na sua checkbox.

    amock.io

    Você pode selecionair seu método http, código de resposta, corpo da mensagem de resposta, tipo de conteúdo, especificair ponto final personalizado, etc.

    É muito útil paira retornair dados simulados de services web remotos paira você, qualquer tipo de aplicativo.

    Isenção de responsabilidade, desenvolvi esse service, por necessidade e fiz isso de forma gratuita paira que outros possam se beneficiair da solução.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.