twitter4j+mockwebserver
例えば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が利用するポートが動的で変わるため(多分ゼロポート使ってるから?)
で実行すると以下のようになる