【问题标题】:How to return different code and error with MockRestAdapter如何使用 MockRestAdapter 返回不同的代码和错误
【发布时间】:2015-08-02 21:33:08
【问题描述】:

我使用MockRestAdapter 在我的测试中返回模拟数据,但我也想测试错误(401、503、UnknownHostException 等) 对于SocketTimeoutException,有一个API,但是不同的响应码呢?

我已经尝试过MockWebServer,但无论我加入什么队列,我总是会从适配器获得 200 的模拟数据。

更新:我想像这样运行我的测试:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class LoginActivityTest {
  @Test public void goodCredentials() {
      activity.login("username", "password");
      assert(...); // Got back 200 and user object (from mock)
  }
  @Test public void wrongCredentials() {
      activity.login("username", "wrong_password");
      something.setResponse(401, "{error: wrong password}");
      assert(...);
  }
  @Test public void someError() {
      activity.login("username", "password");
      something.setResponse(503, "{error: server error}");
      assert(...);
  }
}

更新 2:

发现了一些东西,相当丑陋,但可以满足我的需要:

MockApi implements ServiceApi {
    public static Throwable throwable;
    @Override login(Callback<User> callback) {
        if (throwable != null) {
            sendError(callback)
        } else {
            callback.success(new User("{name:test}"));
        }
    }
    private void sendError(Callback callback) {
        callback.failure(RetrofitError.unexpectedError("", throwable));
    }
}

public class LoginActivityTest {
    @Test public void someError() {
        MockApi.throwable = new InterruptedIOException()
        activity.login("username", "password");
        // Assert having a time out message
   }
   @Test public void someError() {
       MockApi.throwable = new UnknownHostException()
       activity.login("username", "password");
       // Assert having a no internet message
   }
}

仍在努力,所以任何反馈都会有所帮助:)

【问题讨论】:

    标签: android unit-testing mocking retrofit http-error


    【解决方案1】:

    这很容易做到。您只需要实现Client 并在构建模拟RestAdapter 时传递它。

    创建具有适当响应的客户端:

    Client client = new Client() {
        @Override public Response execute(Request request) throws IOException {
            final String reason = "Some reason.";
            final List<Header> headers = new ArrayList<>();
            final TypedString body = new TypedString("");//could be json or what ever you want
            final int status = 401;
            return new Response(request.getUrl(), status, reason, headers, body);
        }
    };
    

    并将其传递给您的RestAdapter.Builder

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint("https://api.com")
            .setClient(client)
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();
    
    restAdapter.create(API.class);
    

    【讨论】:

    • @tibo 我看过了。那么?
    • 我不想为每种类型的错误创建一个客户端,我想使用来自模拟 api 的响应,使用相同的模拟适配器(如果可能的话)。
    猜你喜欢
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多