我使用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
}
}
仍在努力,所以任何反馈都会有所帮助:)
答案 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);