什么是存根/虚拟宁静的Web服务的简单方法?

我想创建一个Android应用程序,这个应用程序将对Web服务进行RESTful调用以获取一些数据。

我知道RESTful接口会是什么,但我不想要创建自己的实现的麻烦。 有没有一种简单的方法来创建一个存根RESTful Web服务,它将返回一些静态数据而无需编写完整的WS应用程序来执行此操作?

  • Retrofit2 error java.io.EOFException:第1行第1列的输入结束
  • 使用Ksoap2(Android)检查信封
  • 如何将HttpEntity转换为JSON?
  • 通过networking服务从服务器发送一个PDF文件到客户端
  • 如何在不更换先例的情况下使用GCM接收多个通知?
  • Android致命信号11(SIGSEGV)位于0x00000040(代码= 1)错误
  • 从片段类调用Web服务(API)的正确方法
  • 为什么要在Android中使用sqlite数据库?
  • 可能最好的办法是在开发应用程序代码时为REST Web服务服务创建一个模拟,然后用代码替换它,以便在编写应用程序后调用实际的Web服务返回“真实”数据。

    我正在编写一个与您类似的应用程序(像您一样)从RESTful Web应用程序获取数据。 在我的应用程序中,我遵循GWT推荐的MVP模式,并且Martin Fowler也将其记录为PassiveView模式。

    你想要做的是抽象出代码,使REST Web服务调用成一个接口(模型)。 此模型类的职责是向演示者/控制器提供数据。 Presenter将处理您的所有业务逻辑,然后将数据传递到视图(视图应该非常愚蠢,也允许它被模拟)。 在测试期间,您将创建一个MockModel来实现模型接口并将测试数据传递给Presenter – 而根本不进行实际的Web服务调用! 然后,当您准备好后,您将使用实际的Web服务替换此类并开始集成测试。

    这种方法的另一个好处是,在模拟模型中创建特定(和可重复)的测试用例很容易。 如果您无法控制实际的Web服务(我假设您没有),则可能很难(甚至不可能)实现。 结果应该是一个更健壮,更好测试的应用程序,无需创建任何测试XML或JSON或自己创建Web服务。

    Mocky.io允许您创建存根端点并指定它们通过公共URL返回的数据。

    Runscope(免责声明,我是创始人)允许您捕获一次真实请求,然后根据需要通过响应回放 URL重播响应 。

    如果你想测试实际的HTTP调用代码,我发现使用Sinatra对这类事情非常有用。 您可以让端点在几秒钟内返回数据。 需要很少的Ruby知识。

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

    你只需要返回一个简单的json对象。

    其中一种方法(类似于Vinnie)是在本地实现您的Web服务。 例如,您的Web服务允许您在线登录用户并获取用户列表。

    webservice接口如下所示:

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

    然后,我们为将在生产中使用的远程webservice实现此接口。 远程实现在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; } } 

    出于测试目的,当webservice不可用或正在开发时,我们实现本地Web服务。 本地实现从assets文件夹获取预定义的JSON响应,并将其解析为适当的响应对象。 由您决定如何实现Web服务行为:它可以是简单的静态响应或一些随机/validation相关的响应。 这是它的一部分:

     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 parseAssetsJson(String filename, Class klass) throws IOException { InputStream is = context.getAssets().open(filename); return JsonParser.getInstance().fromJson(new InputStreamReader(is), klass); } } 

    接下来,我们希望无痛地在实现之间切换。 Web服务的两种实现的使用都是透明的,因为我们使用WebService接口。 因此,我们将在应用启动时配置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/

    您可以在笔记本电脑上独立运行它,配置存根响应并validation您的应用是否发送了您期望的请求。

    它可以通过流畅的Java API或JSON(文件或HTTP)进行配置。

    我最终为类似的目的编写了一个模拟服务工具: https : //github.com/clafonta/Mockey/wiki

    模拟服务是快速构建UI和validation客户端代码的一个很好的工具,但它可能会成为一个兔子洞,所以我建议你在构建自己的之前使用已经存在的东西。 当你搜索’mock’时,Github有很多结果。 无论你做什么,这里都有一些你可能会遇到的关键障碍。

    • 您最终使用错误的数据/ JSON格式。 例如,您的应用程序适用于模拟服务,但在访问实际服务时会中断,因为您的应用程序使用JSON对象,但实际服务返回JSON对象数组。 为避免这种情况,您可以尝试使用JSON Schema来帮助突出显示模拟服务中的无效JSON模型。

    • 您的应用没有提出有效请求。 您的模拟服务通常不关心传入的请求。 例如,真实服务需要“customerID”,您的应用程序永远不会将其传入。为避免这种情况,您可以在模拟服务中构建一些“必需的请求参数”validation逻辑。

    • 测试挑战。 如果您想要测试超出简单“快乐路径”的东西,您的自动化function测试方法需要与您的模拟服务工具进行交互。 例如,您运行测试“ 用户A登录并看到0条消息 ”与“ 用户B登录并看到20条消息 ”。

    你可以试试Jadler( http://jadler.net )。 这是一个我已经工作了一段时间的http存根/模拟库。 它应该满足我的所有要求。

    使用虚拟响应创建一些文件并放入文件夹。 现在转到命令行并执行以下命令:python -m SimpleHTTPServer

    您现在可以在http://:8000访问这些文件和虚拟响应

    我建议看看FakeRest( https://github.com/marmelab/FakeRest ),这是一个使用XMLHTTPRequest猴子修补的客户端唯一的假服务器。

    免责声明:我写了。

    Atmo可能很有用。

    免责声明:我是atmo的作者。

    以防有人在year >= 2017仍在查看此主题。 现在有免费的工具,让你在几秒钟内创建模拟肥皂和rest网络服务,而无需在你的盒子上安装或部署任何东西。

    amock.io

    您可以选择http方法,响应代码,响应消息正文,内容types,指定自定义端点等。

    这对于将模拟数据从远程Web服务返回到您的应用程序,任何types的应用程序非常有用。

    免责声明,我出于必要而开发了这项服务,我将其免费,以便其他人可以从解决方案中受益。

    Beeceptor (免责声明,我是作者)将在这里为您提供确切的用例。 创建API端点,定义模拟路径和响应。 在黑客马拉松中使用它可以在几秒钟内构建模拟API。

    Beeceptor不仅仅是一项嘲弄服务。 它是API的HTTP代理。 例如,如果您有真正的API,请使用真实API作为最终目标。 Beecetor拦截交通和使用规则,

    • 当规则匹配时,API被模拟
    • 当没有规则匹配时,您的目标端点将像往常一样被击中。

    使用Mocky.io,您将拥有不同的API路径,使用Beeceptor,您的基本URL将始终相同。

    您可以使用http://maqueapp.com/来创建模拟Web服务。 它快速简便。 我在theflexshow第157集听说过它(不是flexshow!)