twitter4j+mockwebserver

2015-08-17T13:54:43+09:00 Java Android

例えばtwitter4jを使う所をテストしたい場合にやたらとAPIリクエスト投げられても困るなっていう事案が発生した場合に、twitter4jが投げるリクエストをローカルサーバーとかにぶん投げるようにしてテストしたいみたいなケースの場合の検証をしてみた

※環境はAndroid(Robolectric)

TwitterApiTest.java

package kinjouj.app.oretter;

import android.app.Activity;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;
import twitter4j.User;

import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.rule.MockWebServerRule;

import static org.assertj.core.api.Assertions.*;

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 19)
public class TwitterApiTest {

    @Rule
    public final MockWebServerRule server = new MockWebServerRule();

    @Before
    public void setUp() {
        System.setProperty("twitter4j.restBaseURL", server.getUrl("/").toString());
    }

    @Test
    public void test() throws Exception {
        server.enqueue(new MockResponse().setBody("{ id: 1, name: 'hoge', screen_name: 'hoge' }"));

        Activity activity = Robolectric.setupActivity(Activity.class);
        assertThat(activity).isNotNull();

        User user = TwitterApi.getCurrentUser(activity);
        assertThat(user).isNotNull();
        assertThat(user.getName()).isEqualTo("kinjou__j"); // fail
    }
}

というようにtwitter4j公式にもtwitter4j.propertiesでrestBaseURLを設定するとそこにリクエストが行くようになっている模様(ConfigurationのgetRestBaseURLがそれを返すようになっているからだと思われる)

でMockWebServerのポートを@Before時にtwitter4jプレフィックスを指定してrestBaseURLを設定する。twitter4j.propertiesで設定しないのはMockWebServerが利用するポートが動的で変わるため(多分ゼロポート使ってるから?)

で実行すると以下のようになる

Mockitoでfinalクラスをモック化 (3) Strict-Transport-Security