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
11k
10X と Flutter / 10X with Flutter
hisaichi5518
0
2.4k
ひさいちとの1on1
hisaichi5518
0
2.6k
しあわせ推進委員会 / 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
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
920
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
120
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
3
2k
ルールやカスタム機能、どう活かす?ハンズオンで体感するIBM Bobの出力コントロール
muehara
1
150
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
140
入門!AWS Blocks
ysuzuki
1
110
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
4
650
Oracle AI Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
6
1.5k
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
240
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
130
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
940
Building applications in the Gemini API family.
line_developers_tw
PRO
0
3.2k
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
ラッコキーワード サービス紹介資料
rakko
1
3.6M
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
180
Odyssey Design
rkendrick25
PRO
2
690
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
320
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Making Projects Easy
brettharned
120
6.7k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
44k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
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