MockWebServerRule
okhttp+mockwebserverとかでもmockwebserverをテストで使うっていうネタ書いたけど、MockWebServerのインスタンス作ってグダグダしなくてもMockWebServerRuleを使えば良いらしい
※以前に検証したretrofitプロジェクトを利用して検証
SampleService.java
package sample;
import retrofit.http.GET;
import retrofit.http.Path;
public interface SampleService {
@GET("/entry/{id}")
Entry get(@Path("id") int id);
}
SampleServiceTest.java
package sample;
import org.junit.Before;
import org.junit.Test;
import org.junit.Rule;
import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.rule.MockWebServerRule;
import retrofit.RestAdapter;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
public class SampleServiceTest {
@Rule
public final MockWebServerRule server = new MockWebServerRule();
SampleService service;
@Before
public void setUp() {
RestAdapter restAdapter =
new RestAdapter.Builder()
.setLogLevel(RestAdapter.LogLevel.FULL)
.setEndpoint(server.getUrl("").toString())
.build();
service = restAdapter.create(SampleService.class);
}
@Test
public void test() {
assertThat(server.getRequestCount(), is(0));
server.enqueue(new MockResponse().setBody("{ name: \"abc\" }"));
Entry entry = service.get(1);
assertThat(entry, notNullValue());
assertThat(entry.getName(), is("abc"));
assertThat(server.getRequestCount(), is(1));
}
}
てな感じでやるとログでは
---> HTTP GET http://localhost:45215/entry/1 ---> END HTTP (no body) <--- HTTP 200 http://localhost:45215/entry/1 (266ms) Content-Length: 15 OkHttp-Selected-Protocol: http/1.1 OkHttp-Sent-Millis: 1434552538475 OkHttp-Received-Millis: 1434552538486 { name: "abc" } <--- END HTTP (15-byte body)
な感じでMockResponseした結果がレスポンスとして送出されてる模様。あくまでMockWebServerのインスタンスを生成してグダグダしなくてもMockWebServerRuleのインスタンス生成して、enqueueすれば良いだけっぽい