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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
非定型業務をAI slackbotで自動化する ~ 社内要望を自動壁打ちするbotを作った ~/automating-ad-hoc-work-with-ai-slackbot
shibayu36
0
640
【NRUG vol.18】KubernetesにおけるNew Relicデータ取得量削減の考え方
nrug_member
0
110
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
920
AWSシリコン最前線 〜AI時代のチップ選択を読み解く〜
htokoyo
2
550
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
510
攻撃者視点で考えるDetection Engineering
cryptopeg
2
1.6k
自宅LLMの話
jacopen
1
510
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
160
Socrates × Looker 〜セマンティックレイヤーで進化するデータ分析エージェント〜
hanon52_
3
2.2k
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
140
作って終わりにしない タイミーのセマンティックレイヤー育成の現在地
chanyou0311
4
2.3k
あなたの AI ワークスペースに、 専門コーダーを連れてくる - Amazon Quick Desktop 最新情報
kawaji_scratch
1
130
Featured
See All Featured
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
860
The untapped power of vector embeddings
frankvandijk
2
1.8k
Facilitating Awesome Meetings
lara
57
7k
The agentic SEO stack - context over prompts
schlessera
0
820
Prompt Engineering for Job Search
mfonobong
0
340
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Mobile First: as difficult as doing things right
swwweet
225
10k
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