Slide 1

Slide 1 text

ςελϒϧͳઃܭΛ ໝ૝ͯ͠Έͨ Android Testing Bootcamp #1 yuyakaido

Slide 2

Slide 2 text

ࣗݾ঺հ • ւ౻༏໻ʢ͔͍Ͳ͏Ώ͏΍ʣ • גࣜձࣾΤ΢ϨΧ • ςετॻ͚ॻ͚͓͡͞Μ • Android yuyakaido yuyakaido

Slide 3

Slide 3 text

גࣜձࣾΤ΢ϨΧ • ࣗࣾαʔϏεͷاըɾ։ൃɾӡӦ • ΦϯϥΠϯσʔςΟϯάαʔϏεɿ • Χοϓϧઐ༻ΞϓϦɿ • ࣾһ਺ɿ100໊ • IAC ΤϯδχΞ 60 ඇΤϯδχΞ 40

Slide 4

Slide 4 text

໨࣍ • ಈػ • શମํ਑ • શମઃܭ • DaggerͱRxJava • ςετίʔυ • ·ͱΊ

Slide 5

Slide 5 text

໨࣍ • ಈػ • શମํ਑ • શମઃܭ • DaggerͱRxJava • ςετίʔυ • ·ͱΊ

Slide 6

Slide 6 text

ಈػ • େن໛ΞϓϦͷϝϯςφϯε͕ਏ͍ • ςετΛॻ͖͍͚ͨͲɺઃܭ͕ͪΌΜͱͯ͠ ͳ͍ͱςετ͕ॻ͖ʹ͍͘ • ςετ͕ॻ͖΍͍͢ઃܭΛໝ૝ͯ͠Έͨ

Slide 7

Slide 7 text

໨࣍ • ಈػ • શମํ਑ • શମઃܭ • DaggerͱRxJava • ςετίʔυ • ·ͱΊ

Slide 8

Slide 8 text

શମํ਑ • ܧଓతΠϯςάϨʔγϣϯ • ςετͷ࣮ߦ଎౓Λॏࢹ • ग़དྷΔ͚ͩJUnit/RobolectircͰςετ͢Δ • JUnit/Robolectricͩͱςετ͕೉͍͠ͱ͜ Ζ͚ͩ͸EspressoͰςετ͢Δ

Slide 9

Slide 9 text

໨࣍ • ಈػ • શମํ਑ • શମઃܭ • DaggerͱRxJava • ςετίʔυ • ·ͱΊ

Slide 10

Slide 10 text

શମઃܭ Repository UseCase Presenter View Dao Client Database Server Presentation Domain Infrastructure

Slide 11

Slide 11 text

Presentation • Ͳ͏දࣔ͢Δ͔Λهड़ • MVPϞυΩ • Presenter͸Pure Java (ContextҎ֎) • Presenter͸JUnit/RobolectricͰςετ • View͸EspressoͰςετ(Robolectric΋ซ༻)

Slide 12

Slide 12 text

Domain • ԿΛ࣮ݱ͢Δ͔Λهड़ • Pure Java (ContextҎ֎) • JUnit/RobolectricͰςετ

Slide 13

Slide 13 text

Infrastructure • Ͳ͏΍࣮ͬͯݱ͢Δ͔Λهड़ • DB • API • Pure Java (ContextҎ֎) • JUnit/RobolectricͰςετ

Slide 14

Slide 14 text

໨࣍ • ಈػ • શମํ਑ • શମઃܭ • DaggerͱRxJava • ςετίʔυ • ·ͱΊ

Slide 15

Slide 15 text

Dagger • https://github.com/google/dagger • ຊ൪ͱςετͰΠϯελϯεͷࠩ͠ସ͑ PresentationModule DomainModule AppComponent InfraModule BarModule FooModule BazModule

Slide 16

Slide 16 text

RxJava • https://github.com/ReactiveX/RxJava • ֤૚ΛObservableͰ࿈݁ • ࣮ߦ࣌ʹεϨου͕ࣗ༝ʹઃఆग़དྷΔͨΊɺ ςετ͕ॻ͖΍͘͢ͳΔ

Slide 17

Slide 17 text

໨࣍ • ಈػ • શମํ਑ • શମઃܭ • DaggerͱRxJava • ςετίʔυ • ·ͱΊ

Slide 18

Slide 18 text

ςετίʔυ • Client • Presenter • ৄ͘͠͸ͪ͜Β • https://github.com/yuyakaido/android-genesis

Slide 19

Slide 19 text

Client • GithubͷAPIΛ࢖ͬͨαϯϓϧ • ొ৔ਓ෺ • GithubClient 㲗 GithubClientTest • GithubInfraModule 㲗 GithubInfraTestModule

Slide 20

Slide 20 text

GithubClient public class GithubClient {
 
 private GithubService githubService;
 
 @Inject
 public GithubClient(GithubService service) {
 this.githubService = service;
 }
 
 public Observable> getGithubContributors(String owner, String repo) {
 return CommonClient.retry(githubService.getGithubContributors(owner, repo));
 }
 
 public Observable> getGithubContributors() {
 return getGithubContributors("konifar", "droidkaigi2016");
 }
 
 public interface GithubService {
 @GET("/repos/{owner}/{repo}/contributors")
 Observable> getGithubContributors(
 @Path("owner") String owner, @Path("repo") String repo);
 }
 
 } ΞϓϦ

Slide 21

Slide 21 text

GithubClient public class GithubClient {
 
 private GithubService githubService;
 
 @Inject
 public GithubClient(GithubService service) {
 this.githubService = service;
 }
 
 public Observable> getGithubContributors(String owner, String repo) {
 return CommonClient.retry(githubService.getGithubContributors(owner, repo));
 }
 
 public Observable> getGithubContributors() {
 return getGithubContributors("konifar", "droidkaigi2016");
 }
 
 public interface GithubService {
 @GET("/repos/{owner}/{repo}/contributors")
 Observable> getGithubContributors(
 @Path("owner") String owner, @Path("repo") String repo);
 }
 
 } ΞϓϦ

Slide 22

Slide 22 text

GithubClient public class GithubClient {
 
 private GithubService githubService;
 
 @Inject
 public GithubClient(GithubService service) {
 this.githubService = service;
 }
 
 public Observable> getGithubContributors(String owner, String repo) {
 return CommonClient.retry(githubService.getGithubContributors(owner, repo));
 }
 
 public Observable> getGithubContributors() {
 return getGithubContributors("konifar", "droidkaigi2016");
 }
 
 public interface GithubService {
 @GET("/repos/{owner}/{repo}/contributors")
 Observable> getGithubContributors(
 @Path("owner") String owner, @Path("repo") String repo);
 }
 
 } ΞϓϦ

Slide 23

Slide 23 text

GithubClient public class GithubClient {
 
 private GithubService githubService;
 
 @Inject
 public GithubClient(GithubService service) {
 this.githubService = service;
 }
 
 public Observable> getGithubContributors(String owner, String repo) {
 return CommonClient.retry(githubService.getGithubContributors(owner, repo));
 }
 
 public Observable> getGithubContributors() {
 return getGithubContributors("konifar", "droidkaigi2016");
 }
 
 public interface GithubService {
 @GET("/repos/{owner}/{repo}/contributors")
 Observable> getGithubContributors(
 @Path("owner") String owner, @Path("repo") String repo);
 }
 
 } ΞϓϦ

Slide 24

Slide 24 text

GithubInfraModule @Module
 public class GithubInfraModule {
 
 @Provides
 @Singleton
 public GithubClient.GithubService provideGithubService() {
 return ApiClientGenerator.generate(
 GithubClient.GithubService.class,
 "https://api.github.com");
 }
 
 } ςετ

Slide 25

Slide 25 text

GithubClientTest public class GithubClientTest extends InfraTest {
 
 @Test
 public void getGithubContributorsTest() throws Exception {
 File file = new File("src/test/assets/json/github_contributors.json");
 MockWebServer mockWebServer = new MockWebServer();
 mockWebServer.enqueue(ResponseUtil.createMockResponse(file));
 mockWebServer.start();
 
 GithubInfraTestModule githubInfraTestModule = new GithubInfraTestModule();
 GithubClient githubClient = new GithubClient(
 githubInfraTestModule.provideGithubService(mockWebServer));
 
 TestSubscriber> testSubscriber = new TestSubscriber<>();
 githubClient.getGithubContributors().subscribe(testSubscriber);
 
 testSubscriber.assertNoErrors();
 testSubscriber.assertCompleted();
 List githubContributors = testSubscriber.getOnNextEvents().get(0);
 assertThat(githubContributors.size(), is(1));
 }
 
 } ςετ

Slide 26

Slide 26 text

GithubClientTest public class GithubClientTest extends InfraTest {
 
 @Test
 public void getGithubContributorsTest() throws Exception {
 File file = new File("src/test/assets/json/github_contributors.json");
 MockWebServer mockWebServer = new MockWebServer();
 mockWebServer.enqueue(ResponseUtil.createMockResponse(file));
 mockWebServer.start();
 
 GithubInfraTestModule githubInfraTestModule = new GithubInfraTestModule();
 GithubClient githubClient = new GithubClient(
 githubInfraTestModule.provideGithubService(mockWebServer));
 
 TestSubscriber> testSubscriber = new TestSubscriber<>();
 githubClient.getGithubContributors().subscribe(testSubscriber);
 
 testSubscriber.assertNoErrors();
 testSubscriber.assertCompleted();
 List githubContributors = testSubscriber.getOnNextEvents().get(0);
 assertThat(githubContributors.size(), is(1));
 }
 
 } ςετ

Slide 27

Slide 27 text

GithubInfraTestModule @Module
 public class GithubInfraTestModule {
 
 @Provides
 public GithubClient.GithubService provideGithubService(MockWebServer mockWebServer) {
 return ApiClientGenerator.generate(
 GithubClient.GithubService.class,
 mockWebServer.url("").toString());
 }
 
 } ςετ

Slide 28

Slide 28 text

GithubClientTest public class GithubClientTest extends InfraTest {
 
 @Test
 public void getGithubContributorsTest() throws Exception {
 File file = new File("src/test/assets/json/github_contributors.json");
 MockWebServer mockWebServer = new MockWebServer();
 mockWebServer.enqueue(ResponseUtil.createMockResponse(file));
 mockWebServer.start();
 
 GithubInfraTestModule githubInfraTestModule = new GithubInfraTestModule();
 GithubClient githubClient = new GithubClient(
 githubInfraTestModule.provideGithubService(mockWebServer));
 
 TestSubscriber> testSubscriber = new TestSubscriber<>();
 githubClient.getGithubContributors().subscribe(testSubscriber);
 
 testSubscriber.assertNoErrors();
 testSubscriber.assertCompleted();
 List githubContributors = testSubscriber.getOnNextEvents().get(0);
 assertThat(githubContributors.size(), is(1));
 }
 
 } ςετ

Slide 29

Slide 29 text

GithubClientTest public class GithubClientTest extends InfraTest {
 
 @Test
 public void getGithubContributorsTest() throws Exception {
 File file = new File("src/test/assets/json/github_contributors.json");
 MockWebServer mockWebServer = new MockWebServer();
 mockWebServer.enqueue(ResponseUtil.createMockResponse(file));
 mockWebServer.start();
 
 GithubInfraTestModule githubInfraTestModule = new GithubInfraTestModule();
 GithubClient githubClient = new GithubClient(
 githubInfraTestModule.provideGithubService(mockWebServer));
 
 TestSubscriber> testSubscriber = new TestSubscriber<>();
 githubClient.getGithubContributors().subscribe(testSubscriber);
 
 testSubscriber.assertNoErrors();
 testSubscriber.assertCompleted();
 List githubContributors = testSubscriber.getOnNextEvents().get(0);
 assertThat(githubContributors.size(), is(1));
 }
 
 } ςετ

Slide 30

Slide 30 text

GithubClientTest public class GithubClientTest extends InfraTest {
 
 @Test
 public void getGithubContributorsTest() throws Exception {
 File file = new File("src/test/assets/json/github_contributors.json");
 MockWebServer mockWebServer = new MockWebServer();
 mockWebServer.enqueue(ResponseUtil.createMockResponse(file));
 mockWebServer.start();
 
 GithubInfraTestModule githubInfraTestModule = new GithubInfraTestModule();
 GithubClient githubClient = new GithubClient(
 githubInfraTestModule.provideGithubService(mockWebServer));
 
 TestSubscriber> testSubscriber = new TestSubscriber<>();
 githubClient.getGithubContributors().subscribe(testSubscriber);
 
 testSubscriber.assertNoErrors();
 testSubscriber.assertCompleted();
 List githubContributors = testSubscriber.getOnNextEvents().get(0);
 assertThat(githubContributors.size(), is(1));
 }
 
 } ςετ

Slide 31

Slide 31 text

GithubClientTest public class GithubClientTest extends InfraTest {
 
 @Test
 public void getGithubContributorsTest() throws Exception {
 File file = new File("src/test/assets/json/github_contributors.json");
 MockWebServer mockWebServer = new MockWebServer();
 mockWebServer.enqueue(ResponseUtil.createMockResponse(file));
 mockWebServer.start();
 
 GithubInfraTestModule githubInfraTestModule = new GithubInfraTestModule();
 GithubClient githubClient = new GithubClient(
 githubInfraTestModule.provideGithubService(mockWebServer));
 
 TestSubscriber> testSubscriber = new TestSubscriber<>();
 githubClient.getGithubContributors().subscribe(testSubscriber);
 
 testSubscriber.assertNoErrors();
 testSubscriber.assertCompleted();
 List githubContributors = testSubscriber.getOnNextEvents().get(0);
 assertThat(githubContributors.size(), is(1));
 }
 
 } ςετ

Slide 32

Slide 32 text

GithubClientTest public class GithubClientTest extends InfraTest {
 
 @Test
 public void getGithubContributorsTest() throws Exception {
 File file = new File("src/test/assets/json/github_contributors.json");
 MockWebServer mockWebServer = new MockWebServer();
 mockWebServer.enqueue(ResponseUtil.createMockResponse(file));
 mockWebServer.start();
 
 GithubInfraTestModule githubInfraTestModule = new GithubInfraTestModule();
 GithubClient githubClient = new GithubClient(
 githubInfraTestModule.provideGithubService(mockWebServer));
 
 TestSubscriber> testSubscriber = new TestSubscriber<>();
 githubClient.getGithubContributors().subscribe(testSubscriber);
 
 testSubscriber.assertNoErrors();
 testSubscriber.assertCompleted();
 List githubContributors = testSubscriber.getOnNextEvents().get(0);
 assertThat(githubContributors.size(), is(1));
 }
 
 } ςετ

Slide 33

Slide 33 text

Clientͷςετ • square/okhttp/mockwebserver͕௒ศར • DaggerΛ࢖ͬͯϞοΫαʔόʔ΁ͷࠩ͠ସ͑ • JUnit/RobolectricͰߴ଎ʹςετՄೳ

Slide 34

Slide 34 text

Presenter • Clientͱಉ༷ʹGithubͷAPIΛ࢖ͬͨαϯϓϧ • ొ৔ਓ෺ • GithubPresenter 㲗 GithubPresenterTest

Slide 35

Slide 35 text

GithubPresenter public class GithubPresenter {
 
 @Inject
 Scheduler scheduler;
 
 private GithubView githubView;
 private GithubUseCase githubUseCase;
 
 public GithubPresenter(Context context, GithubView githubView, GithubUseCase githubUseCase) {
 Genesis.getGenesisComponent(context).inject(this);
 this.githubView = githubView;
 this.githubUseCase = githubUseCase;
 } ʢதུʣ
 
 } ΞϓϦ

Slide 36

Slide 36 text

GithubPresenter public class GithubPresenter {
 
 public void onCreate() {
 githubView.initViews();
 githubView.showProgressBar();
 githubView.refresh();
 }
 
 public void onItemClick(GithubContributor githubContributor) {
 githubView.startWebViewActivity(githubContributor);
 } ʢதུʣ
 
 } ΞϓϦ

Slide 37

Slide 37 text

GithubPresenter public class GithubPresenter {
 
 public void refresh() {
 githubUseCase.getGithubContributors()
 .subscribeOn(scheduler)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Subscriber>() {
 @Override
 public void onCompleted() {
 }
 
 @Override
 public void onError(Throwable e) {
 }
 
 @Override
 public void onNext(List githubContributors) {
 githubView.setGithubContributors(githubContributors);
 githubView.hideProgressBar();
 }
 });
 } ʢதུʣ
 
 } ΞϓϦ

Slide 38

Slide 38 text

GithubPresenterTest public class GithubPresenterTest extends PresentationTest {
 
 private GithubView githubView;
 private GithubUseCase githubUseCase;
 private GithubPresenter githubPresenter;
 
 @Override
 public void setUp() {
 super.setUp();
 githubView = mock(GithubView.class);
 githubUseCase = mock(GithubUseCase.class);
 githubPresenter = new GithubPresenter(getContext(), githubView, githubUseCase);
 } ʢதུʣ
 
 } ςετ

Slide 39

Slide 39 text

GithubPresenterTest public class GithubPresenter {
 
 public void onCreate() {
 githubView.initViews();
 githubView.showProgressBar();
 githubView.refresh();
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onCreateTest() {
 githubPresenter.onCreate();
 
 verify(githubView, times(1)).initViews();
 verify(githubView, times(1)).showProgressBar();
 verify(githubView, times(1)).refresh();
 }
 
 } ςετ

Slide 40

Slide 40 text

GithubPresenterTest public class GithubPresenter {
 
 public void onCreate() {
 githubView.initViews();
 githubView.showProgressBar();
 githubView.refresh();
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onCreateTest() {
 githubPresenter.onCreate();
 
 verify(githubView, times(1)).initViews();
 verify(githubView, times(1)).showProgressBar();
 verify(githubView, times(1)).refresh();
 }
 
 } ςετ

Slide 41

Slide 41 text

GithubPresenterTest public class GithubPresenter {
 
 public void onCreate() {
 githubView.initViews();
 githubView.showProgressBar();
 githubView.refresh();
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onCreateTest() {
 githubPresenter.onCreate();
 
 verify(githubView, times(1)).initViews();
 verify(githubView, times(1)).showProgressBar();
 verify(githubView, times(1)).refresh();
 }
 
 } ςετ

Slide 42

Slide 42 text

GithubPresenterTest public class GithubPresenter {
 
 public void onCreate() {
 githubView.initViews();
 githubView.showProgressBar();
 githubView.refresh();
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onCreateTest() {
 githubPresenter.onCreate();
 
 verify(githubView, times(1)).initViews();
 verify(githubView, times(1)).showProgressBar();
 verify(githubView, times(1)).refresh();
 }
 
 } ςετ

Slide 43

Slide 43 text

GithubPresenterTest public class GithubPresenter {
 
 public void onCreate() {
 githubView.initViews();
 githubView.showProgressBar();
 githubView.refresh();
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onCreateTest() {
 githubPresenter.onCreate();
 
 verify(githubView, times(1)).initViews();
 verify(githubView, times(1)).showProgressBar();
 verify(githubView, times(1)).refresh();
 }
 
 } ςετ

Slide 44

Slide 44 text

GithubPresenterTest public class GithubPresenter {
 public void refresh() {
 githubUseCase.getGithubContributors()
 .subscribeOn(scheduler)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Action1>() {
 @Override
 public void call(List githubContributors) {
 githubView.setGithubContributors(githubContributors);
 githubView.hideProgressBar();
 }
 });
 }
 } public class GithubPresenterTest extends PresentationTest {
 @Test
 public void refreshTest() {
 Observable> observable = Observable.create(
 new Observable.OnSubscribe>() {
 @Override
 public void call(Subscriber super List> subscriber) {
 subscriber.onNext(new ArrayList());
 subscriber.onCompleted();
 }
 }
 );
 when(githubUseCase.getGithubContributors()).thenReturn(observable);
 
 githubPresenter.refresh();
 
 verify(githubView, times(1)).setGithubContributors(new ArrayList());
 verify(githubView, times(1)).hideProgressBar();
 }
 } ςετ

Slide 45

Slide 45 text

GithubPresenterTest public class GithubPresenter {
 public void refresh() {
 githubUseCase.getGithubContributors()
 .subscribeOn(scheduler)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Action1>() {
 @Override
 public void call(List githubContributors) {
 githubView.setGithubContributors(githubContributors);
 githubView.hideProgressBar();
 }
 });
 }
 } public class GithubPresenterTest extends PresentationTest {
 @Test
 public void refreshTest() {
 Observable> observable = Observable.create(
 new Observable.OnSubscribe>() {
 @Override
 public void call(Subscriber super List> subscriber) {
 subscriber.onNext(new ArrayList());
 subscriber.onCompleted();
 }
 }
 );
 when(githubUseCase.getGithubContributors()).thenReturn(observable);
 
 githubPresenter.refresh();
 
 verify(githubView, times(1)).setGithubContributors(new ArrayList());
 verify(githubView, times(1)).hideProgressBar();
 }
 } ςετ

Slide 46

Slide 46 text

GithubPresenterTest public class GithubPresenter {
 public void refresh() {
 githubUseCase.getGithubContributors()
 .subscribeOn(scheduler)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Action1>() {
 @Override
 public void call(List githubContributors) {
 githubView.setGithubContributors(githubContributors);
 githubView.hideProgressBar();
 }
 });
 }
 } public class GithubPresenterTest extends PresentationTest {
 @Test
 public void refreshTest() {
 Observable> observable = Observable.create(
 new Observable.OnSubscribe>() {
 @Override
 public void call(Subscriber super List> subscriber) {
 subscriber.onNext(new ArrayList());
 subscriber.onCompleted();
 }
 }
 );
 when(githubUseCase.getGithubContributors()).thenReturn(observable);
 
 githubPresenter.refresh();
 
 verify(githubView, times(1)).setGithubContributors(new ArrayList());
 verify(githubView, times(1)).hideProgressBar();
 }
 } ςετ

Slide 47

Slide 47 text

GithubPresenterTest public class GithubPresenter {
 public void refresh() {
 githubUseCase.getGithubContributors()
 .subscribeOn(scheduler)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Action1>() {
 @Override
 public void call(List githubContributors) {
 githubView.setGithubContributors(githubContributors);
 githubView.hideProgressBar();
 }
 });
 }
 } public class GithubPresenterTest extends PresentationTest {
 @Test
 public void refreshTest() {
 Observable> observable = Observable.create(
 new Observable.OnSubscribe>() {
 @Override
 public void call(Subscriber super List> subscriber) {
 subscriber.onNext(new ArrayList());
 subscriber.onCompleted();
 }
 }
 );
 when(githubUseCase.getGithubContributors()).thenReturn(observable);
 
 githubPresenter.refresh();
 
 verify(githubView, times(1)).setGithubContributors(new ArrayList());
 verify(githubView, times(1)).hideProgressBar();
 }
 } ςετ

Slide 48

Slide 48 text

GithubPresenterTest public class GithubPresenter { 
 public void onItemClick(GithubContributor githubContributor) {
 githubView.startWebViewActivity(githubContributor);
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onItemClickTest() {
 githubPresenter.onItemClick(null);
 
 verify(githubView, times(1)).startWebViewActivity(null);
 }
 
 } ςετ

Slide 49

Slide 49 text

GithubPresenterTest public class GithubPresenter { 
 public void onItemClick(GithubContributor githubContributor) {
 githubView.startWebViewActivity(githubContributor);
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onItemClickTest() {
 githubPresenter.onItemClick(null);
 
 verify(githubView, times(1)).startWebViewActivity(null);
 }
 
 } ςετ

Slide 50

Slide 50 text

GithubPresenterTest public class GithubPresenter { 
 public void onItemClick(GithubContributor githubContributor) {
 githubView.startWebViewActivity(githubContributor);
 }
 
 } public class GithubPresenterTest extends PresentationTest {
 
 @Test
 public void onItemClickTest() {
 githubPresenter.onItemClick(null);
 
 verify(githubView, times(1)).startWebViewActivity(null);
 }
 
 } ςετ

Slide 51

Slide 51 text

Presenterͷςετ • ந৅Խ͞ΕͨUseCaseͱView • ͦΕΒʹର͢ΔΠϯλϥΫγϣϯ͕ద੾ʹߦ ΘΕ͍ͯΔ͔Λςετ • JUnit/RobolectricͰߴ଎ʹςετՄೳ

Slide 52

Slide 52 text

໨࣍ • ಈػ • શମํ਑ • શମઃܭ • DaggerͱRxJava • ςετίʔυ • ·ͱΊ

Slide 53

Slide 53 text

·ͱΊ • PresentationɿͲ͏දࣔ͢Δ͔ • DomainɿԿΛ࣮ݱ͢Δ͔ • InfrastructureɿͲ͏΍࣮ͬͯݱ͢Δ͔ • DIΛ࢖ͬͯຊ൪ͱςετͰΠϯελϯεΛ੾Γସ͑Δ • RxJavaΛ࢖࣮ͬͯߦεϨουͷ੾Γସ͑

Slide 54

Slide 54 text

·ͱΊ • ϝϦοτ • ֤૚ͷ໾ׂͱґଘؔ܎Λ੔ཧͨ͜͠ͱͰςελϒϧͳઃܭʹ • Android΁ͷґଘΛ࠷খݶʹͨ͜͠ͱͰߴ଎ͳςετՄೳʹ • σϝϦοτ • Ϋϥε਺͕ଟ͍ • νʔϜ։ൃͷ৔߹͸͋Δఔ౓ͷυΩϡϝϯτ͕ඞਢ

Slide 55

Slide 55 text

ΤϯδχΞ ઈࢍ࠾༻தʂ ฐࣾ$%0 ʢνʔϑɾυοάɾΦϑΟαʔʣ ͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ

Slide 56

Slide 56 text

Thank you :) Credit: NASA Earth Observatory/NOAA NGDC

Slide 57

Slide 57 text

ิ଍ࢿྉ

Slide 58

Slide 58 text

CommonClient public class CommonClient {
 
 private static final int RETRY_COUNT = 3;
 private static final int RETRY_DELAY = 3;
 
 public static Observable retry(Observable observable) {
 return observable.retryWhen(new Func1, Observable>>() {
 @Override
 public Observable> call(Observable extends Throwable> observable) {
 return observable.take(RETRY_COUNT).flatMap(new Func1>() {
 @Override
 public Observable> call(Throwable throwable) {
 return Observable.timer(RETRY_DELAY, TimeUnit.SECONDS);
 }
 });
 }
 });
 }
 
 }

Slide 59

Slide 59 text

ApiClientGenerator public class ApiClientGenerator {
 
 public static T generate(Class clazz, String baseUrl) {
 return new Retrofit.Builder()
 .client(HttpClient.getInstance())
 .baseUrl(baseUrl)
 .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
 .addConverterFactory(GsonConverterFactory.create())
 .build()
 .create(clazz);
 }
 
 }

Slide 60

Slide 60 text

HttpClient public class HttpClient {
 
 private static OkHttpClient instance;
 
 private HttpClient() {}
 
 public static synchronized OkHttpClient getInstance() {
 if (instance == null) {
 HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
 httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
 instance = new OkHttpClient.Builder()
 .addInterceptor(httpLoggingInterceptor)
 .addNetworkInterceptor(new StethoInterceptor())
 .build();
 }
 
 return instance;
 }
 
 }

Slide 61

Slide 61 text

GithubView public interface GithubView {
 
 void initViews();
 void refresh();
 void showProgressBar();
 void hideProgressBar();
 void setGithubContributors(List githubContributors);
 void startWebViewActivity(GithubContributor githubContributor);
 
 }

Slide 62

Slide 62 text

GithubUseCase public interface GithubUseCase {
 
 Observable> getGithubContributors();
 
 }