Slide 1

Slide 1 text

. P D L 3 F U S P G J U .BTBZVLJ*;6.*!J[VNJO LZPCBTIJEFY

Slide 2

Slide 2 text

> Masayuki IZUMI a.k.a. @izumin5210 > Rekimoto Lab. at the Univ. of Tokyo > Strobo, Inc. / Wantedly, Inc. > Rubyist / Androider / {Java,Type}Scripter

Slide 3

Slide 3 text

T R V B S F  S F U S P G J U  W   Y // Entity class public class User { public long id; public String name; public String screenName; public Date createdAt; public Date updatedAt; public String icon; public String email; }

Slide 4

Slide 4 text

T R V B S F  S F U S P G J U  W   Y // API client interface public interface UsersApi { @GET("/v1/user") Single get( @Query("access_token") String accessToken ); }

Slide 5

Slide 5 text

T R V B S F  S F U S P G J U  W   Y X J U I  3 Y + B W B  B O E  ( T P O Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.esa.io/") // Uses Gson for response's deserialization .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // Allows to return rx.Observable/rx.Single from service methods .addConverterFactory(GsonConverterFactory.create(gson)) .build(); // Generates an implementation of the UsersApi interface UsersApi api = retrofit.create(UsersApi.class);

Slide 6

Slide 6 text

T R V B S F  S F U S P G J U  W   Y X J U I  3 Y + B W B // Generates an implementation of the UsersApi interface api.get(accessToken) .subscribeOn(Schedulers.io()) .subscribe(user -> { // do something... })

Slide 7

Slide 7 text

) P X  U P  U F T U  J U ) P X  U P  N P D L  J U

Slide 8

Slide 8 text

  % F G J O F T  B  N P D L  D M B T T  Z P V S T F M G class MockUsersApi implements UsersApi { @Override Single get(String accessToken) { User mockUser = new User(); // ... return mockUser; } } // write your test cases below...

Slide 9

Slide 9 text

  4 U V C T  N F U I P E T  F  H   . P D L J U P UsersApi mockUsersApi = mock(UsersApi.class); when(mockUsersApi.get(accessToken)).thenReturn(mockUser); // write your test cases below...

Slide 10

Slide 10 text

  6 T F T  . P D L 8 F C 4 F S W F S D P N  T R V B S F V Q  P L I U U Q   N P D L X F C T F S W F S MockWebServer server = new MockWebServer(); // Read a mock json file from resources String mockBody = ""; server.enqueue(new MockResponse().setBody(mockBody)); // Start the server server.start();

Slide 11

Slide 11 text

  6 T F T  . P D L 3 F U S P G J U D P N  T R V B S F V Q  S F U S P G J U   S F U S P G J U  N P D L Retrofit retrofit = new Retrofit.Builder() // snip. .build(); NetworkBehavior behavior = NetworkBehavior.create() // if you need MockRetrofit mockRetrofit = new MockRetrofit.Build(retrofit) .networkBehavior(behavior) // if you need .build(); UsersApi usersApi = MockUsersApi(mockRetrofit.create(UsersApi.class))

Slide 12

Slide 12 text

  6 T F T  . P D L 3 F U S P G J U D P N  T R V B S F V Q  S F U S P G J U   S F U S P G J U  N P D L Retrofit retrofit = new Retrofit.Builder() // snip. .build(); NetworkBehavior behavior = NetworkBehavior.create() // if you need MockRetrofit mockRetrofit = new MockRetrofit.Build(retrofit) .networkBehavior(behavior) // if you need .build(); UsersApi usersApi = MockUsersApi(mockRetrofit.create(UsersApi.class))

Slide 13

Slide 13 text

  6 T F T  . P D L 3 F U S P G J U D P N  T R V B S F V Q  S F U S P G J U   S F U S P G J U  N P D L Retrofit retrofit = new Retrofit.Builder() // snip. .build(); NetworkBehavior behavior = NetworkBehavior.create() // if you need MockRetrofit mockRetrofit = new MockRetrofit.Build(retrofit) .networkBehavior(behavior) // if you need .build(); UsersApi usersApi = MockUsersApi(mockRetrofit.create(UsersApi.class))

Slide 14

Slide 14 text

  6 T F T  . P D L 3 F U S P G J U D P N  T R V B S F V Q  S F U S P G J U   S F U S P G J U  N P D L Retrofit retrofit = new Retrofit.Builder() // snip. .build(); NetworkBehavior behavior = NetworkBehavior.create() // if you need MockRetrofit mockRetrofit = new MockRetrofit.Build(retrofit) .networkBehavior(behavior) // if you need .build(); UsersApi usersApi = MockUsersApi(mockRetrofit.create(UsersApi.class))

Slide 15

Slide 15 text

  S F U S P G J U   N P D L   # F I B W J P S % F M F H B U F class MockUsersApi implements UsersApi { private final BehaviorDelegate delegate; // snip the constructor @Override Single get(String accessToken) { User mockUser = new User(); // ... return delegate.returning(Calls.response(mockUser)).fetch(accessToken); } }

Slide 16

Slide 16 text

  S F U S P G J U   N P D L   # F I B W J P S % F M F H B U F class MockUsersApi implements UsersApi { private final BehaviorDelegate delegate; // snip the constructor @Override Single get(String accessToken) { User mockUser = new User(); // ... return delegate.returning(Calls.response(mockUser)).fetch(accessToken); } }

Slide 17

Slide 17 text

  S F U S P G J U   N P D L   # F I B W J P S % F M F H B U F class MockUsersApi implements UsersApi { private final BehaviorDelegate delegate; // snip the constructor @Override Single get(String accessToken) { User mockUser = new User(); // ... return delegate.returning(Calls.response(mockUser)).fetch(accessToken); } } Call response(T) Call response(Response) Call failure(IOException)

Slide 18

Slide 18 text

  S F U S P G J U   N P D L   / F U X P S L # F I B W J P S Retrofit retrofit = new Retrofit.Builder() // snip. .build(); NetworkBehavior behavior = NetworkBehavior.create() // if you need MockRetrofit mockRetrofit = new MockRetrofit.Build(retrofit) .networkBehavior(behavior) // if you need .build(); UsersApi usersApi = MockUsersApi(mockRetrofit.create(UsersApi.class))

Slide 19

Slide 19 text

  S F U S P G J U   N P D L   / F U X P S L # F I B W J P S NetworkBehavior behavior = NetworkBehavior.create(); // DEFAULT: 2000 ms behavior.setDelay(500, TimeUnit.MILLISECONDS); // DEFAULT: 3 % behavior.setFailurePercent(50); // DEFAULT: 40 % behavior.setVariancePercent(50);

Slide 20

Slide 20 text

$ P O D M V T J P O  5PNPDLNFUIPETPGUIFSFUPSpUJOUFSGBDF  JNQMFNFOUTNPDLDMBTTZPVSTFMG  TUVCTNFUIPET FH.PDLJUP  VTFT.PDL8FC4FSWFS  VTFT.PDL3FUSPpU

Slide 21

Slide 21 text

$ P O D M V T J P O  .PDL8FC4FSWFS .PDL3FUSPpU TUVCCJOHNFUIPET NPDLDMBTTFT TJNQMF qFYJCMF ˕ ˕ ˓ ˓ ˚ ˚ !4NBMM5FTU !.FEJVN5FTU VTFGVMGPS !-BSHF5FTU

Slide 22

Slide 22 text

. P D L 3 F U S P G J U T B N Q M F  D P E F  I U U Q T    H J U I V C  D P N  J [ V N J O      4 V O B [ V S J B Q Q  T S D  U F T U  L P U M J O  J O G P  J [ V N J O  B O E S P J E  T V O B [ V S J  J O G S B T U S V D U V S F  S F Q P T J U P S Z  T P V S D F  U F B N  5 F B N 3 F N P U F % B U B 4 P V S D F 5 F T U  L U .BTBZVLJ*;6.*!J[VNJO LZPCBTIJEFY