MockWebServerRule

2015-06-18T00:00:00+09:00 Java

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すれば良いだけっぽい

ng-infinite-scroll ECMAScript6でangular.js