Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
既存のAndroidアプリをリファクタリングしていく話
Search
hisaichi5518
July 02, 2016
Technology
7.2k
23
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
既存のAndroidアプリをリファクタリングしていく話
hisaichi5518
July 02, 2016
More Decks by hisaichi5518
See All by hisaichi5518
技術力あげたい
hisaichi5518
4
4.9k
Dartにおける静的解析 / FlutterKaigi 2022
hisaichi5518
0
2.3k
ソフトウェアエンジニアが品質保証を学んでわかったこと / What software engineers have learned about quality assurance
hisaichi5518
6
12k
10X と Flutter / 10X with Flutter
hisaichi5518
0
2.4k
ひさいちとの1on1
hisaichi5518
0
2.7k
しあわせ推進委員会 / Shiawase Promotion Committee
hisaichi5518
0
1.3k
2017-03-23
hisaichi5518
0
3.8k
Pepabo Tech Conference 7
hisaichi5518
1
1.2k
かんばんやりたい
hisaichi5518
0
1.1k
Other Decks in Technology
See All in Technology
LangfuseによるLLMOps基盤の構築と活用事例
zozotech
PRO
1
280
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
120
【Google Cloud Next Tokyo'26】Gemini Enterprise と Oracle AI Database で実現する、業務データ活用を実現する AI エージェント実装
shisyu_gaku
0
210
toio・myCobotでフィジカルAIっぽいことを行うための検討(とりあえず調査) / フィジカルAI LT(IoTLTによる開催)
you
PRO
0
280
事業価値と Engineering 2026年度版
recruitengineers
PRO
32
16k
【CEDEC2026】『GRANBLUE FANTASY: Relink - Endless Ragnarok』のバトル制作事例 ~最高のキャラゲーを目指して~
cygames
PRO
0
190
ウォーターフォール開発案件のPMとしてAI活用を模索している話
hatahata021
3
310
ラジオの科学
frievea
0
210
AIエージェントを前提としたプラットフォーム エンジニアリング:GKEで作るAgent-Ready Golden Path
legalontechnologies
PRO
1
170
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
0
270
plamo-3-translateの開発
pfn
PRO
0
280
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
760
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
350
A better future with KSS
kneath
240
18k
Code Reviewing Like a Champion
maltzj
528
40k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
920
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
330
How to make the Groovebox
asonas
2
2.3k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Transcript
!IJTBJDIJ(.01&1"#0JOD طଘͷ"OESPJEΞϓϦΛ ϦϑΝΫλϦϯά͍ͯ͘͠
γχΞΤϯδχΞ !IJTBJDIJ ٢ߴ༝ཬࢠ٢ߴ༝ཬࢠ٢ߴ༝ཬࢠ XXXZPTIJUBLBZVSJLPDPN
NJOOF ϛϯω
ࠓɺ"OESPJEΞϓϦΛ୲த
طଘͷ"OESPJEΞϓϦΛ ϦϑΝΫλϦϯά͢Δ
ͳʹΛ͔͢ w͍͔ͭ͘ى͖ͨʹ͍ͭͯɾͲ͏ͬͯղܾ͔ͨ͠
͞ͳ͍͜ͱ w3Y+BWBͱ͔%BUB#JOEJOHͱ͔φ͍ϥΠϒϥϦͷ wઈඒ͍͠ઃܭͷ
None
ळʙ w"OESPJEΞϓϦͷ։ൃελʔτ wॳ"OESPJEνʔϜਓ wJ04ΞϓϦʹൺͯػೳͷ͕ࠩ͋ͬͨͷͰɺͱʹ͔͘ ։ൃεϐʔυ༏ઌ wIUUQTQFQBCPDPNSFDSVJUJOUFSWJFX @
Նʙ w"OESPJEΞϓϦνʔϜ͕ਓʹͳͬͨ wࣗ͜ͷࠒʹ"OESPJEνʔϜʹೖͬͨ
͜Ε͔Βόʔϯͱ͍ͧ͘ʙʂ
ൃੜ
ςετ͕ͳ͍
ͳͥςετ͕ඞཁͳͷ͔ wΑΓ৴པग़དྷΔΞϓϦʹ͠ͳ͚ΕͳΒͳ͍͔Β
৴པग़དྷΔΞϓϦͬͯͳʹ wΞϓϦʹόά͕গͳ͍ wΞϓϦ͕ಥવམͪͳ͍ wαʔϏεӡӦݩ͕৴༻ग़དྷΔ wͳͲͳͲ༷ʑͳཁҼ͕͋Δ
৴པग़དྷΔΞϓϦͬͯͳʹ wΞϓϦʹόά͕গͳ͍ wΞϓϦ͕ಥવམͪͳ͍ wαʔϏεӡӦݩ͕৴༻ग़དྷΔ wͳͲͳͲ༷ʑͳཁҼ͕͋Δ ຬ͍ͨͨ͠
৴པग़དྷΔΞϓϦʹͳΔͨΊ ςετඞཁ
ςετͳ͍Λ ղܾ͢ΔͨΊʹͬͨ͜ͱ
ղܾ͢ΔͨΊʹ w6*ςετΛॻ͘ wςετͷͷಋೖ w%FWJDF'BSNΛ͏
6*ςετΛॻ͜͏ wϙνϙνςετΛগࣗ͠ಈԽ͍ͨ͠ w&TQSFTTPΛར༻͍ͯ͠·͢
1 @RunWith(AndroidJUnit4.class) 2 @LargeTest 3 public class HelloWorldEspressoTest { 4
5 @Rule 6 public ActivityTestRule<MainActivity> mActivityRule 7 = new ActivityTestRule(MainActivity.class); 8 9 @Test 10 public void listGoesOverTheFold() { 11 onView(withText("Hello world!")).check(matches(isDisplayed())); 12 } 13 }
1 @RunWith(AndroidJUnit4.class) 2 @LargeTest 3 public class HelloWorldEspressoTest { 4
5 @Rule 6 public ActivityTestRule<MainActivity> mActivityRule 7 = new ActivityTestRule(MainActivity.class); 8 9 @Test 10 public void listGoesOverTheFold() { 11 onView(withText("Hello world!")).check(matches(isDisplayed())); 12 } 13 }
ςετͷͷಋೖ wςετΛॻ͘͜ͱʹ׳Εͯͳ͍ਓ͕ଟ͔ͬͨ wςετΛॻ͘͜ͱʹ׳ΕΔͨΊʹɺςετ͚ͩΛॻ ͘Λिؒʹઃ͚Δ͜ͱʹͨ͠
%FWJDF'BSNͷར༻ w6*ςετΛॻ͍ͯܧଓతʹ࣮ߦ͍ͯ͠ͳ͍ͱҙຯ͕ ͳ͍ w"NB[PO͕ࣾఏڙ͢Δʮ࣮ࡍͷσόΠεΛར༻ͯ͠ς ετΛ࣮ߦͯ͘͠ΕΔʯαʔϏε wϒϥϯνຖʹ࣮ߦ͢ΔΑ͏ʹͯ͠ɺςετ͕௨Βͳ͍ ͱϚʔδ͠ͳ͍ϧʔϧΛܾΊͨ
ਐΊํ
ػೳ։ൃͦͷ··ਐΊΔ wػೳ։ൃͦͷ··ਐΊͳ͕Βɺ৽͘͠։ൃ͢Δͱ͜ ΖͷςετΛͳΔ͘ॻ͍͍ͯ͘ํ wνʔϜϝϯόʔ͕૿͑ͨͷػೳ։ൃΛΑΓεϜʔζ ʹߦ͏ͨΊͳͷͰɺςετΛॻ͘ͱ͍͏͜ͱػೳ։ ൃΛࢭΊͯ·ͰΔ͜ͱͰͳ͔ͬͨ
δϫδϫͱ6*ςετ͕ ૿͖͑ͯͨ
ൃੜ
6*ςετͭΒ͍
6*ςετͷͳʹ͕ͭΒ͍ wλΠϛϯά࣍ୈͰ࣌ʑίέΔςετ͕૿͑ͨ wେ͖ΊͷมߋΛߦ͏ͱ6*ςετͷ࡞Γ͠ʹͳͬͯԿ 6*ςετΛॻ͖ͯ͠Δ w6*ςετͷ࣮ߦ͕࣌ؒͯ͘ɺ͕ͭ࣌ؒ૿͑ͨ wͦͦ6*ςετΛॻͨ͘Ίʹ֮͑Δࣄ͕ଟͯ͘େม
ςετΛͭΒ͍ͷආ͚͍ͨͷʹ ͨ͘͠ͳ͍ͷͰղܾ͍ͨ͠
6*ςετΑΓ୯ମςετͷ ΄͏͕ྑ͍ؾ͕͢Δ
6*ςετWT୯ମςετ w6*ςετɺςετͷ୯Ґ͕େ͖͍ w୯ମςετɺϝιου୯ҐͰਖ਼͘͠ಈ࡞͢Δͷ͔ݕ ূ͢ΔͷͰςετͷ୯Ґ͕খ͍͞ w୯ମςετɺ֮͑Δ͜ͱগͳ͍
ͬͺ୯ମςετͷ΄͏͕ ྑ͍ؾ͕͢Δ
ͳͥͨͪ6*ςετΛॻ ͍͍ͯΔΜͩ
"OESPJE5FTUͰͳ͍ͱಈ͔ͳ͍ Ϋϥεͷதʹςετ͍ͨ͠ͷ͕ ͋Δ
ͳͥ୯ମςετͷதͰಈ͔ͳ͍Ϋϥε ͷதʹςετ͍ͨ͠ͷ͕͋Δ
̍ͭͷΫϥεͷ͕େ͖͗͢ɻ ΫϥεͷΛখ͘͞ग़དྷ͍ͯͳ ͍
ͭͷΫϥεʹ٧ΊࠐΈա͗
ͳͥͭͷΫϥεʹ٧ΊࠐΈա͗Δͱͳͷ͔ w୯ମςετ͕ॻ͖ʹ͍͘ wαʔϏεΛΑΓͤ͞ΔʹɺมԽʹڧ͘ͳ͚Ε ͳΒͳ͍
มԽʹڧ͍ wมԽʹڧ͍ͱɺʮίʔυͷཧղ͕͍͢͠ʯʮมߋ ΛՃ͍͑͢ʯʮՃ͑ͨมߋͷӨڹΛཧղ͍͢͠ʯ Λࢦ͢
ͭͷΫϥεʹ٧ΊࠐΈա͗Δͱʜ wʮίʔυͷཧղ͕͠ʹ͍͘ʯʮมߋΛՃ͑ʹ͍͘ʯʮՃ ͑ͨมߋͷӨڹΛཧղ͠ʹ͍͘ʯ w୯ମςετͰςετ͠ʹ͍͘
ͳͷͰ ͭͷΫϥεʹ٧ΊࠐΈ͗͢
ͭͷΫϥεʹ٧ΊࠐΈա͗Λ ղܾ͢ΔͨΊʹͬͨ͜ͱ
ͳͥΛখ͘͞ग़དྷ͍ͯ ͳ͍ͷ͔
Ϋϥε͕ԿΛ୲͖͢ͳͷ͔໌֬ ʹܾ·͍ͬͯͳ͍͔Β
ͭ·Γɺܾ·ΓࣄΛܾΊͯ͋͛ΕΑ͍
ܾ·ΓࣄΞʔΩςΫνϟ
.71ΞʔΩςΫνϟΛ࠾༻͢Δ
ϩδοΫ wϓϨθϯςʔγϣϯϩδοΫ wϏδωεϩδοΫ
ϓϨθϯςʔγϣϯϩδοΫ ඞཁͳΛϏδωεϩδοΫʹ ͢·ͰͷৼΔ͍
ϏδωεϩδοΫ "1*σʔλϕʔεͳͲ͔Β Λಘͯɺฦ͢
ϓϨθϯςʔγϣϯϩδοΫ ϏδωεϩδοΫ͔Β ฦ͖ͬͯͨΛܗͯ͠ දࣔ͢ΔৼΔ͍
None
.71ΞʔΩςΫνϟ
.7$ͷੜ
.7$
.PEFM7JFX$POUSPMMFS
.7$"OESJPEΞϓϦʹ͍͍ͯͳ͍
7JFXͷૢ࡞ "DUJWJUZͰߦ͏
$POUSPMMFS "DUJWJUZʹॻ͘
7JFX $POUSPMMFS"DUJWJUZ
ΫϥεͷΛখ͘͞ग़དྷ͍ͯͳ͍
.7$"OESJPEΞϓϦʹ͍͍ͯͳ͍
.71
.PEFM7JFX1SFTFOUFS
.PEFM wϏδωεϩδοΫΛॻ͘ w1SFTFOUFSʹґଘ͠ͳ͍ w7JFXʹґଘ͠ͳ͍
7JFX wϢʔβʔ͔ΒͷೖྗΛड͚औΔ wϢʔβʔ͔ΒͷೖྗΛ1SFTFOUFSʹ͢ wը໘ͷදࣔߋ৽Λߦ͏
1SFTFOUFS wϓϨθϯςʔγϣϯϩδοΫΛॻ͘ w7JFXͷߋ৽ɺJOUFSGBDFΛܦ༝ͯ͠ߦ͏
.7$WT.71
.7$
1 public class UserActivity extends AppCompatActivity { 2 @Override 3
protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 fetchUser(userId); 6 } 7 8 private void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 showName(name); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 showError(error); 19 } 20 }); 21 } 22 23 public void showName(String name) { 24 mTextView.setText(name); 25 } 26 27 public void showError(...) { ... } 28 }
1 public class UserActivity extends AppCompatActivity { 2 @Override 3
protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 fetchUser(userId); 6 } 7 8 private void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 showName(name); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 showError(error); 19 } 20 }); 21 } 22 23 public void showName(String name) { 24 mTextView.setText(name); 25 } 26 27 public void showError(...) { ... } 28 } ೖྗΛड͚औΔ ϓϨθϯςʔγϣϯϩδοΫ 7JFXͷߋ৽
1 public class UserActivity extends AppCompatActivity { 2 @Override 3
protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 fetchUser(userId); 6 } 7 8 private void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 showName(name); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 showError(error); 19 } 20 }); 21 } 22 23 public void showName(String name) { 24 mTextView.setText(name); 25 } 26 27 public void showError(...) { ... } 28 } ೖྗΛड͚औΔ
1 public class UserActivity extends AppCompatActivity { 2 @Override 3
protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 fetchUser(userId); 6 } 7 8 private void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 showName(name); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 showError(error); 19 } 20 }); 21 } 22 23 public void showName(String name) { 24 mTextView.setText(name); 25 } 26 27 public void showError(...) { ... } 28 } ϓϨθϯςʔγϣϯϩδοΫ
1 public class UserActivity extends AppCompatActivity { 2 @Override 3
protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 fetchUser(userId); 6 } 7 8 private void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 showName(name); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 showError(error); 19 } 20 }); 21 } 22 23 public void showName(String name) { 24 mTextView.setText(name); 25 } 26 27 public void showError(...) { ... } 28 } 7JFXͷߋ৽
1 public class UserActivity extends AppCompatActivity { 2 @Override 3
protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 fetchUser(userId); 6 } 7 8 private void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 showName(name); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 showError(error); 19 } 20 }); 21 } 22 23 public void showName(String name) { 24 mTextView.setText(name); 25 } 26 27 public void showError(...) { ... } 28 } ೖྗΛड͚औΔ ϓϨθϯςʔγϣϯϩδοΫ 7JFXͷߋ৽
.71
1 public class UserActivity extends AppCompatActivity implements UserView { 2
@Override 3 protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 UserPresenter presenter = new UserPresenter(this); 6 presenter.fetchUser(userId); 7 } 8 9 @Override 10 public void showName(String name) { 11 mTextView.setText(name); 12 } 13 14 @Override 15 public void showError(...) { ... } 16 } 6TFS"DUJWJUZ
1 public class UserActivity extends AppCompatActivity implements UserView { 2
@Override 3 protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 UserPresenter presenter = new UserPresenter(this); 6 presenter.fetchUser(userId); 7 } 8 9 @Override 10 public void showName(String name) { 11 mTextView.setText(name); 12 } 13 14 @Override 15 public void showError(...) { ... } 16 } 1 public interface UserView { 2 void showName(String name); 3 void showError(...); 4 } 7JFXͷߋ৽ϝιου͕ఆٛ 6TFS7JFX
1 public class UserPresenter { 2 UserView mView; 3 4
public UserPresenter(UserView view) { 5 mView = view; 6 } 7 8 public void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 mView.showName(user.getName()); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 mView.showError(error); 19 } 20 }); 21 } 22 } 6TFS1SFTFOUFS
1 public class UserActivity extends AppCompatActivity implements UserView { 2
@Override 3 protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 UserPresenter presenter = new UserPresenter(this); 6 presenter.fetchUser(userId); 7 } 8 9 @Override 10 public void showName(String name) { 11 mTextView.setText(name); 12 } 13 14 @Override 15 public void showError(...) { ... } 16 } ೖྗΛड͚औΔ 7JFXͷߋ৽ 6TFS"DUJWJUZ
1 public class UserActivity extends AppCompatActivity implements UserView { 2
@Override 3 protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 UserPresenter presenter = new UserPresenter(this); 6 presenter.fetchUser(userId); 7 } 8 9 @Override 10 public void showName(String name) { 11 mTextView.setText(name); 12 } 13 14 @Override 15 public void showError(...) { ... } 16 } ೖྗΛड͚औΔ 6TFS"DUJWJUZ
1 public class UserPresenter { 2 UserView mView; 3 4
public UserPresenter(UserView view) { 5 mView = view; 6 } 7 8 public void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 mView.showName(user.getName()); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 mView.showError(error); 19 } 20 }); 21 } 22 } 6TFS1SFTFOUFS ϓϨθϯςʔγϣϯϩδοΫ
1 public class UserPresenter { 2 UserView mView; 3 4
public UserPresenter(UserView view) { 5 mView = view; 6 } 7 8 public void fetchUser(int userId) { 9 UserService service = ApiClient.getInstance().create(UsersService.class); 10 service.fetch(userId, new Callback<User>() { 11 @Override 12 public void success(User user, Response response) { 13 mView.showName(user.getName()); 14 } 15 16 @Override 17 public void failure(RetrofitError error) { 18 mView.showError(error); 19 } 20 }); 21 } 22 } 6TFS1SFTFOUFS 6TFS7JFXJOUFSGBDFΛܦ༝ͯ͠7JFXͷߋ৽
1 public class UserActivity extends AppCompatActivity implements UserView { 2
@Override 3 protected void onCreate(Bundle savedInstanceState) { 4 int userId = ...; 5 UserPresenter presenter = new UserPresenter(this); 6 presenter.fetchUser(userId); 7 } 8 9 @Override 10 public void showName(String name) { 11 mTextView.setText(name); 12 } 13 14 @Override 15 public void showError(...) { ... } 16 } 7JFXͷߋ৽ 6TFS"DUJWJUZ
.717JFX͔Β ϓϨθϯςʔγϣϯϩδοΫΛग़དྷΔ
͜ΕͰϓϨθϯςʔγϣϯϩδοΫͷςε τ͕୯ମςετͰॻ͚Δͧʙ
Ͳ͏͍͏ςετʹͳΔͷ͔
1 public class UserPresenterTest { 2 @Test 3 public void
testFetchUser() throws Exception { 4 final AtomicBoolean called = new AtomicBoolean(); 5 mMockClient.mock("/v4/users/1.json").to(200, "user.json"); 6 7 class MockedView implements UserView { 8 @Override 9 public void showName(String name) { 10 called.set(true); 11 assertThat(name).isEqualTo("hisaichi5518"); 12 } 13 } 14 15 UserPresenter presenter = new UserPresenter(new MockedView()); 16 presenter.fetchUser(1); 17 assertThat(called.get()).isEqualTo(true); 18 } 19 } 7JFXͷߋ৽ JOUFSGBDFΛܦ༝ͯ͠ߦ͏
1 public class UserPresenterTest { 2 @Test 3 public void
testFetchUser() throws Exception { 4 final AtomicBoolean called = new AtomicBoolean(); 5 mMockClient.mock("/v4/users/1.json").to(200, "user.json"); 6 7 class MockedView implements UserView { 8 @Override 9 public void showName(String name) { 10 called.set(true); 11 assertThat(name).isEqualTo("hisaichi5518"); 12 } 13 } 14 15 UserPresenter presenter = new UserPresenter(new MockedView()); 16 presenter.fetchUser(1); 17 assertThat(called.get()).isEqualTo(true); 18 } 19 } JOUFSGBDFΛܧঝ͍ͯ͠Δ 7JFXͲ͖͑͋͞Ε 1SFTFOUFSͷςετͰ͖Δ
1 public class UserPresenterTest { 2 @Test 3 public void
testFetchUser() throws Exception { 4 final AtomicBoolean called = new AtomicBoolean(); 5 mMockClient.mock("/v4/users/1.json").to(200, "user.json"); 6 7 class MockedView implements UserView { 8 @Override 9 public void showName(String name) { 10 called.set(true); 11 assertThat(name).isEqualTo("hisaichi5518"); 12 } 13 } 14 15 UserPresenter presenter = new UserPresenter(new MockedView()); 16 presenter.fetchUser(1); 17 assertThat(called.get()).isEqualTo(true); 18 } 19 } 7JFXͲ͖
1 public class UserPresenterTest { 2 @Test 3 public void
testFetchUser() throws Exception { 4 final AtomicBoolean called = new AtomicBoolean(); 5 mMockClient.mock("/v4/users/1.json").to(200, "user.json"); 6 7 class MockedView implements UserView { 8 @Override 9 public void showName(String name) { 10 called.set(true); 11 assertThat(name).isEqualTo("hisaichi5518"); 12 } 13 } 14 15 UserPresenter presenter = new UserPresenter(new MockedView()); 16 presenter.fetchUser(1); 17 assertThat(called.get()).isEqualTo(true); 18 } 19 }
1 public class UserPresenterTest { 2 @Test 3 public void
testFetchUser() throws Exception { 4 final AtomicBoolean called = new AtomicBoolean(); 5 mMockClient.mock("/v4/users/1.json").to(200, "user.json"); 6 7 class MockedView implements UserView { 8 @Override 9 public void showName(String name) { 10 called.set(true); 11 assertThat(name).isEqualTo("hisaichi5518"); 12 } 13 } 14 15 UserPresenter presenter = new UserPresenter(new MockedView()); 16 presenter.fetchUser(1); 17 assertThat(called.get()).isEqualTo(true); 18 } 19 }
None
.71ಋೖͷਐΊํ
.71ಋೖ࣌ͷਐΊํ wཧɿςετΛॻ͍͔ͯΒϦϑΝΫλϦϯά͍ͯ͘͠ wݱ࣮ɿϦϑΝΫλϦϯάͱҰॹʹςετΛॻ͘ wಋೖɺݴ͍ग़ͬ͠ͷ͕ࣗͬͨ wಋೖޙɺνʔϜϝϯόʔ͕֤ʑ.71ΞʔΩςΫ νϟʹԊ࣮ͬͯΛਐΊΔ
ଞʹͬͨ͜ͱ
ଞʹͬͨ͜ͱ wνʔϜϝϯόʔʹ.71ΞʔΩςΫνϟʹ͍ͭͯڞ༗ wIUUQIJTBJDIJIBUFOBCMPHKQFOUSZ wςετͰ։ൃ"1*Λୟ͘Θ͚ʹ͍͔ͳ͍ͷͰ .PDL$MJFOUͷ࡞ wIUUQIJTBJDIJIBUFOBCMPHKQFOUSZ
ଞʹͬͨ͜ͱ w.71ΞʔΩςΫνϟͷαϯϓϧΞϓϦ࡞ w3PCPMFDUSJD(SBEMF5FTU3VOOFSΛܧঝͨ͠ 5FTU3VOOFSΛࣗ࡞ wϒϥϯνຖʹ$*্Ͱ୯ମςετΛ࣮ߦ͢ΔΑ͏ʹ͠ ͯɺͦͷςετ͕௨Βͳ͍ͱϚʔδ͠ͳ͍ϧʔϧ w%FWJDF'BSNΛ࣮ߦ͢ΔϒϥϯνϦϦʔεϒϥϯν ʹߜͬͨ
.71Ͱͬͯͳ͍͜ͱ
.71Ͱͬͯͳ͍͜ͱ w1SFTFOUFSͷ͍ճ͠ wͭͷ7JFXʹෳͷ1SFTFOUFSΛ࣋ͨͤΔ
ͳͥɺ1SFTFOUFSΛ͍·Θ͞ͳ͍ͷ͔ w1SFTFOUFSɺ7JFXͷৼΔ͍ w7JFX͕ҧ͏ͱ͍͏͜ͱɺৼΔ͍ҧ͏
ͳͥɺͭͷ7JFXʹͭͷ1SFTFOUFSʹ͢Δͷ͔ wͭͷ7JFXͷதͰʮϢʔβʔใऔಘͷৼΔ͍ʯʮ࡞ ใऔಘͷৼΔ͍ʯͱ͍͏Α͏ͳୟ͘"1*͝ͱʹ 1SFTFOUFSΛ͚ͨΓ͠ͳ͍ w1SFTFOUFS7JFXͷৼΔ͍ͳͷͰదʹׂ୲ ͕ग़དྷ͍ͯΔͷͰ͋ΕɺͭͰेͳͣ
1SFTFOUFSͷΓग़͠ਐΈ ୯ମςετ૿͖͑ͯͯॱௐ
ൃੜ
ͭͷ1SFTFOUFS͕ େ͖͍Α
ͬͯͳ͍͜ͱͷͭ ͭͷ7JFXʹෳͷ1SFTFOUFS Λ࣋ͨͤΔ
ྫ ͕ͭͷ'SBHNFOU 7JFX ͜ͷ7JFXʹɺׂ͕ͭ͋ Δɻ
ྫ ͓ؾʹೖΓొɾղআ ࡞ใදࣔ ࡞ͷҰཡऔಘɾදࣔ
ͭͷ1SFTFOUFS͕େ͖͍Λ ղܾ͢ΔͨΊʹͬͨ͜ͱ
ׂ͝ͱʹ $VTUPN7JFXʹΓ͚Δ
ྫ ͓ؾʹೖΓొɾղআ ࡞ใදࣔ ࡞ͷҰཡऔಘɾදࣔ
େ͖ͳ1SFTFOUFSΛׂͰ͖ͨ
͜Μͳײ͡Ͱ ϦϑΝΫλϦϯάਐΊ͍ͯ·͢
·ͱΊ
·ͱΊ w6*ςετΛ૿ͦ͏ͱࣦͯ͠ഊ w୯ମςετ͕ॻ͚ͳ͍ͷͭͷΫϥεʹ٧ΊࠐΈա ͍͗ͯΔ͔Β wͭͷΫϥεʹ٧ΊࠐΈա͗Δͷɺܾ·Γࣄ͕ͳ͍ ͔Β wܾ·ΓࣄͱɺΞʔΩςΫνϟ
·ͱΊ wΞʔΩςΫνϟʹ.71Λ࠾༻ w.7$"OESPJEͩͱͷ͕Ͱ͖ͳ͍ w.717JFX͔ΒϓϨθϯςʔγϣϯϩδοΫΛ Ͱ͖Δ w7JFXͷׂ͕େ͖͍ͱ1SFTFOUFS͕େ͖͘ͳͬͯ͠ ·͏ͷͰɺ$VTUPN7JFXʹΓग़ͯ͠খ͘͢͞Δ
Ұॹʹಇ͍ͯ͘Εʙʙʙ ࠷৽ͷ࠾༻ใΛνΣοΫˠ !QC@SFDSVJU
͕࣌ؒ ༨Ε
։ൃ εϐʔυ
ʹ͍ͭͯ
l៉ྷͳίʔυΑΓ։ൃεϐʔυ༏ઌz
ͱ͍͏͜ͱ w៉ྷͳίʔυɺ։ൃεϐʔυͱൺྫ͢Δ
ͳΔ΄Ͳ
͜͏ࢥ͏οε w៉ྷͳίʔυΛॻ͍ͯɺ։ൃεϐʔυ͕མͪͳ͍ w៉ྷͳίʔυɺ։ൃεϐʔυͱൺྫ͢Δ
ͳ͔ͥ w៉ྷͳίʔυͱɺมԽʹڧ͍ίʔυ wมԽʹڧ͍ίʔυߴʹมԽग़དྷΔͷͰɺ։ൃεϐʔ υૣ͍ͣ
มԽʹڧ͍ʢ͓͞Β͍ʣ wมԽʹڧ͍ͱɺʮίʔυͷཧղ͕͍͢͠ʯʮมߋ ΛՃ͍͑͢ʯʮՃ͑ͨมߋͷӨڹΛཧղ͍͢͠ʯ Λࢦ͢
࣮ࡍͲ͏ͩͬͨͷ͔ νʔϜϝϯόʔʹฉ͍ͯΈͨ
.71ΞʔΩςΫνϟΛ͍ΕͯΈͯ ։ൃεϐʔυམͪ·ͨ͠
νʔϜϝϯόʔʹฉ͍ͯΈͨ wʮ.71ΞʔΩςΫνϟͰճ͘Β͍ॻ͘·Ͱ׳Εͳ ͔ͬͨʯ wʮ׳Εͨ͋ͱɺϩδοΫͷॴͱ͔͕୳͘͢͠ͳͬ ͯɺঃʑʹ։ൃ͕࣌ؒ͘ͳ͍ͬͯΔΑ͏ʹײͨ͡ʯ
ͭ·Γ wظతʹݟΕɺ׳ΕΔ·Ͱʹ͕͔͔࣌ؒΔͷͰ։ൃ εϐʔυԼ͕Δ wதظతʹݟΕɺมԽʹڧ͍ίʔυʹͳ͍ͬͯͬͯ ΔͷͰɺ։ൃεϐʔυ্͕͍ͬͯ͘
ͲͪΒͷࢹͰݟΔ͔ ͋ͳͨ࣍ୈ
Ұॹʹಇ͍ͯ͘Εʙʙʙ ࠷৽ͷ࠾༻ใΛνΣοΫˠ !QC@SFDSVJU