java - 如何模拟 Google API AndroidPublisher 请求

标签 java android google-api-client google-api-java-client

我有一个类向 AndroidPublisher API 发出请求以获取 Purchases.Subscriptions.get资源。如何模拟 OAuth 请求和调用以使用包 com.google.api.client.testing 中的类获取订阅资源?

这是获取订阅的代码:

HttpTransport httpTransport = new NetHttpTransport.Builder().build();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(httpTransport)
    .setJsonFactory(jsonFactory)
    .setServiceAccountId("email")
    .setServiceAccountScopes(singleton(AndroidPublisherScopes.ANDROIDPUBLISHER))
    .setServiceAccountPrivateKeyFromP12File(new File("file.p12"))
    .build();
AndroidPublisher androidPublisher = new AndroidPublisher.Builder(httpTransport, jsonFactory, credential)
    .setApplicationName("appname")
    .build();
AndroidPublisher.Purchases.Subscriptions.Get get = androidPublisher.purchases().subscriptions().get(
    "appname",
    "productId",
    "purchaseToken");
SubscriptionPurchase subscription = get.execute();
System.out.println(subscription.toPrettyString());

这是我目前尝试模拟 JSON 响应但未成功的方式:

MockLowLevelHttpResponse mockResponse = new MockLowLevelHttpResponse();
mockResponse.setStatusCode(200);
mockResponse.setContentType(Json.MEDIA_TYPE);
mockResponse.setContent("{\n" +
        "  \"autoRenewing\" : true,\n" +
        "  \"countryCode\" : \"US\",\n" +
        "  \"developerPayload\" : \"\",\n" +
        "  \"expiryTimeMillis\" : \"1480019001357\",\n" +
        "  \"kind\" : \"androidpublisher#subscriptionPurchase\",\n" +
        "  \"paymentState\" : 1,\n" +
        "  \"priceAmountMicros\" : \"990000\",\n" +
        "  \"priceCurrencyCode\" : \"USD\",\n" +
        "  \"startTimeMillis\" : \"1477333413210\"\n" +
        "}");
return new MockHttpTransport.Builder().setLowLevelHttpResponse(mockResponse).build();

当我使用模拟类运行测试时,我得到以下堆栈跟踪:

java.lang.IllegalArgumentException: no JSON input found
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:125)
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:49)
at com.google.api.client.json.JsonParser.startParsing(JsonParser.java:223)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:380)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:355)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)

我错过了什么?如何模拟 OAuth2 响应以及获取订阅的调用?

最佳答案

我能够弄清楚我的问题。除了模拟 HttpTransport 之外,我还必须提供模拟的 GoogleCredential,例如:

new MockGoogleCredential.Builder().build();

关于java - 如何模拟 Google API AndroidPublisher 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40250497/

相关文章:

java - 解释synchronized()内部的Commons Lang代码?

java - 如何通过java访问与我正在使用的服务器不同的服务器上的目录?

java - 如何保存复选框状态? - 安卓

android - GoogleApiClient 无法解析

objective-c - 在示例 gdata-objectivec-client 中出现 "invalid_client"错误

google-api - 谷歌 OAuth2 API。检查用户有两个因素的身份验证(不是 GSuite)

java - 我的乔达时区搞砸了

java - 将 2D String 数组转换为 2D double

java - 将项目导入 Eclipse 后出现“必须覆盖父类(super class)方法”错误

android - ActionBarSherlock:通过方法调用以编程方式显示/隐藏操作项按钮