28

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

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

4

14 回答 14

14

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

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

于 2013-06-27T19:08:43.513 回答
9

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

require 'sinatra'
require 'json'

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

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

于 2012-03-02T15:48:10.800 回答
6

其中一种方法(类似于 Vinnie 的方法)是在本地实现您的 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;
    }
}

出于测试目的,当 webservice 不可用或正在开发时,我们实现本地 webservice。本地实现从 assets 文件夹中获取预定义的 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 的两种实现的使用都是透明的,因为我们使用了 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();
    }
}
于 2013-03-06T09:12:01.930 回答
3

我建议查看 WireMock(免责声明 - 我写的): http ://wiremock.org/

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

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

于 2013-04-19T10:43:16.533 回答
1

你可以试试 Jadler ( http://jadler.net )。这是一个我已经研究了一段时间的 http stubbing/mocking 库。我相信它应该满足您的所有要求。

于 2013-08-01T22:01:54.200 回答
1

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

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

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

  • 您的应用未发出有效请求。您的模拟服务通常不会关心传入的请求。例如,真正的服务需要一个“customerID”,而您的应用从不传递它。为避免这种情况,您可以在模拟服务中构建一些“必需的请求参数”验证逻辑。

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

于 2013-03-18T15:54:41.280 回答
1

有一个名为QuickMocker的全新模拟 API 解决方案,它不仅允许存根静态数据,还可以使用简码生成假(faker)、随机和上下文数据。支持多种 HTTP 方法和 RegExp URL 路径,允许创建甚至一个可以拦截您需要的任何内容的虚拟端点。是的,它允许调试对您的虚假 API 域发出的任何请求。

于 2021-05-16T15:48:41.430 回答
1

Beeceptor(免责声明,我是作者)将在此处帮助您了解确切的用例。创建一个 API 端点,定义一个模拟路径和响应。在黑客马拉松中使用它可以在几秒钟内构建模拟 API。

Beeceptor 不仅仅是一个模拟服务。它是 API 的 HTTP 代理。例如,如果您有一个真正的 API,则使用真正的 API 作为最终目标。Beecetor 拦截流量并使用规则,

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

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

于 2017-11-17T21:04:24.710 回答
1

以防万一有人还在看这个帖子year >= 2017。现在有免费工具可以让您在几秒钟内创建模拟肥皂和休息网络服务,而无需在您的盒子上安装或部署任何东西。

amock.io

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

对于从远程 Web 服务向您的应用程序(任何类型的应用程序)返回模拟数据非常有用。

免责声明,我开发此服务是出于必要,我将其免费提供,以便其他人可以从该解决方案中受益。

于 2016-10-23T10:52:42.530 回答
0

我建议看一下 FakeRest ( https://github.com/marmelab/FakeRest ),这是一个使用 XMLHTTPRequest 猴子补丁的仅限客户端的 Fake Server。

免责声明:我写的。

于 2015-03-25T09:01:23.560 回答
0

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

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

于 2014-07-09T13:52:18.743 回答
0

最好的办法可能是在开发应用程序代码时为 REST Web 服务服务创建一个模拟,然后在编写应用程序后将其替换为调用返回“真实”数据的实际 Web 服务的代码。

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

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

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

于 2012-01-09T13:53:27.937 回答
0

Atmo可能很有用。

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

于 2016-07-01T05:25:30.530 回答
-1

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

于 2012-01-09T14:04:53.963 回答