如何使用MockRestAdapter返回不同的代码和错误

时间:2015-08-02 21:33:08

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

我使用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
   }
}

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

1 个答案:

答案 0 :(得分:0)

这很容易做到。您只需要实现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);