I've got a method in an use case which requires a Retofit Response object as parameter and I need to test it. Now, I can use the Retrofit itself and build one with the network, but it would require the full android shebang.
I've opted instead for building a Retrofit Response manually. My method is testing headers, so I'll need to build a Response with headers. The Response method to do this is:
public static <T> Response<T> success(T body,
com.squareup.okhttp.Response rawResponse) {
return new Response<>(rawResponse, body, null);
}
A note: Where you see Response , it's actually retrofit.Response. The OkHttp counterpart is prefixed: com.squareup.okhttp.Response.
So, in turn I require an OkHttp Response object. OkHttp uses the builder pattern for everything, so, to make my life easier, I'm preparing the builder in a setUp() method:
private com.squareup.okhttp.Response.Builder mOkHttpResponseBuilder;
@Before public void setUp() {
HttpUrl mHttpUrl = new HttpUrl.Builder()
.scheme("https")
.host("example.com")
.build();
Request mRequest = new Request.Builder()
.url(mHttpUrl)
.build();
// Prepare the builder with common stuff.
mOkHttpResponseBuilder = new com.squareup.okhttp.Response.Builder()
.request(mRequest)
.protocol(Protocol.HTTP_1_1)
.code(302);
}
Here, you can see several elements:
- A HttpUrl object which defines the URL used (builder pattern)
- A OkHttp Request object which requires mHttpUrl (bulder pattern)
- The OkHttp Response.Builder object which requires the Request object defined above and a protocol.
Now, we can use the builder over and over:
com.squareup.okhttp.Response okHttpResponse = mOkHttpResponseBuilder
.addHeader(LoginUseCase.LOCATION_HEADER, LoginUseCase.LOGIN_SUCCESSFUL)
.build();
Response<String> response = Response.success(null, okHttpResponse);
Assert.assertTrue(new LoginUseCase().isLoggedIn(response));
Fairly simple.
HTH,
Member discussion: