我想创建一个 android 应用程序,该应用程序将对 Web 服务进行 RESTful 调用以获取一些数据。
我知道 RESTful 接口是什么,但我不想麻烦地创建自己的实现。有没有一种简单的方法来创建一个 stub RESTful Web 服务,该服务将返回一些静态数据,而无需编写一个完整的 WS 应用程序来执行此操作?
我想创建一个 android 应用程序,该应用程序将对 Web 服务进行 RESTful 调用以获取一些数据。
我知道 RESTful 接口是什么,但我不想麻烦地创建自己的实现。有没有一种简单的方法来创建一个 stub RESTful Web 服务,该服务将返回一些静态数据,而无需编写一个完整的 WS 应用程序来执行此操作?
如果你想测试实际的 HTTP 调用代码,我发现使用Sinatra对这类事情非常有用。您可以让端点在几秒钟内返回数据。所需的 Ruby 知识很少。
require 'sinatra'
require 'json'
get '/Person' do
content_type :json
{ :id => 345, :key2 => 'John Doe' }.to_json
end
您只需要返回一个简单的 json 对象。
其中一种方法(类似于 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();
}
}
我建议查看 WireMock(免责声明 - 我写的): http ://wiremock.org/
您可以在笔记本电脑上独立运行它,配置存根响应并验证您的应用程序是否发送了您期望的请求。
它可以通过流畅的 Java API 或 JSON(文件或 HTTP)进行配置。
你可以试试 Jadler ( http://jadler.net )。这是一个我已经研究了一段时间的 http stubbing/mocking 库。我相信它应该满足您的所有要求。
我最终为类似目的编写了一个模拟服务工具:https ://github.com/clafonta/Mockey/wiki
模拟服务是快速构建 UI 和验证客户端代码的好工具,但它可能会变成一个兔子洞,所以我建议您在构建自己的之前使用已经存在的东西。当你搜索“mock”时,Github 有很多结果。无论您做什么,这里都有一些您可能会遇到的关键绊脚石。
您最终会使用错误的数据/JSON 格式。例如,您的应用在模拟服务上运行良好,但在访问真实服务时会中断,因为您的应用使用 JSON 对象,但真实服务返回 JSON 对象数组。为避免这种情况,您可以尝试使用 JSON Schema 来帮助突出显示模拟服务中的无效 JSON 模型。
您的应用未发出有效请求。您的模拟服务通常不会关心传入的请求。例如,真正的服务需要一个“customerID”,而您的应用从不传递它。为避免这种情况,您可以在模拟服务中构建一些“必需的请求参数”验证逻辑。
测试挑战。如果您想测试简单的“快乐路径”之外的东西,您的自动化功能测试方法需要与您的模拟服务工具交互。例如,您运行测试“用户 A 登录并看到 0 条消息”与“用户 B 登录并看到 20 条消息”。
有一个名为QuickMocker的全新模拟 API 解决方案,它不仅允许存根静态数据,还可以使用简码生成假(faker)、随机和上下文数据。支持多种 HTTP 方法和 RegExp URL 路径,允许创建甚至一个可以拦截您需要的任何内容的虚拟端点。是的,它允许调试对您的虚假 API 域发出的任何请求。
Beeceptor(免责声明,我是作者)将在此处帮助您了解确切的用例。创建一个 API 端点,定义一个模拟路径和响应。在黑客马拉松中使用它可以在几秒钟内构建模拟 API。
Beeceptor 不仅仅是一个模拟服务。它是 API 的 HTTP 代理。例如,如果您有一个真正的 API,则使用真正的 API 作为最终目标。Beecetor 拦截流量并使用规则,
使用 Mocky.io,您将拥有不同的 API 路径,使用 Beeceptor,您的基本 URL 将始终相同。
以防万一有人还在看这个帖子year >= 2017
。现在有免费工具可以让您在几秒钟内创建模拟肥皂和休息网络服务,而无需在您的盒子上安装或部署任何东西。
您可以选择您的 http 方法、响应代码、响应消息正文、内容类型、指定自定义端点等。
对于从远程 Web 服务向您的应用程序(任何类型的应用程序)返回模拟数据非常有用。
免责声明,我开发此服务是出于必要,我将其免费提供,以便其他人可以从该解决方案中受益。
我建议看一下 FakeRest ( https://github.com/marmelab/FakeRest ),这是一个使用 XMLHTTPRequest 猴子补丁的仅限客户端的 Fake Server。
免责声明:我写的。
创建一些带有虚拟响应的文件并放入文件夹中。现在转到命令行并执行以下命令: python -m SimpleHTTPServer
您现在可以在 http://:8000 访问这些文件和虚拟响应
最好的办法可能是在开发应用程序代码时为 REST Web 服务服务创建一个模拟,然后在编写应用程序后将其替换为调用返回“真实”数据的实际 Web 服务的代码。
我目前正在编写一个与您非常相似的应用程序,它(像您一样)从 RESTful Web 应用程序获取数据。在我的应用程序中,我遵循 GWT 推荐的MVP模式,Martin Fowler 也将其记录为PassiveView模式。
您要做的是抽象出代码以使 REST Web 服务调用成为接口(模型)。这个模型类的职责是向 Presenter/Controller 提供数据。Presenter 将处理您的所有业务逻辑,然后将数据传递给视图(视图应该非常愚蠢,也允许它被模拟出来)。在测试期间,您将创建一个 MockModel 来实现模型接口并将测试数据传递给 Presenter - 根本不需要进行实际的 Web 服务调用!然后,当您准备好时,您将用实际的 Web 服务替换这个类并开始您的集成测试。
这种方法还有一个额外的好处,那就是它可以很容易地在你的模拟模型中创建特定的(和可重复的)测试用例。如果您无法控制实际的 Web 服务(我假设您没有),这可能很难(甚至不可能)实现。结果应该是一个更健壮、更好测试的应用程序,而无需创建任何测试 XML 或 JSON 或自己创建 Web 服务。
Atmo可能很有用。
免责声明:我是 atmo 的作者。
您可以使用http://maqueapp.com/创建模拟 Web 服务。它又快又容易。我在theflexshow 第 157 集听说过(不是 flexshow!)