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

时间:2012-01-09 13:08:33

标签: android web-services rest stub dummy-data

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

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

14 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:9)

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

require 'sinatra'
require 'json'

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

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

答案 2 :(得分:5)

其中一种方法(类似于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服务行为:它可以是简单的静态响应或一些随机/验证相关的响应。这是它的一部分:

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实例。 Application课程符合我们的需求:

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();
    }
}

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:1)

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

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

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

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

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

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

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

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

您现在可以访问这些文件和虚拟回复了 HTTP://:8000

答案 9 :(得分:0)

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

免责声明:我写了它。

答案 10 :(得分:0)

Atmo可能有用。

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

答案 11 :(得分:0)

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

amock.io

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

将远程网络服务的模拟数据返回给您的应用,任何类型的应用都非常有用。

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

答案 12 :(得分:0)

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

答案 13 :(得分:-1)

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

上听说过