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.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
公式ドキュメントの歩き方etc
coco_se
0
100
しくみを学んで使いこなそう GitHub Copilot app
torumakabe
2
240
DatabricksにおけるMCPソリューション
taka_aki
1
240
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
0
120
Kaggleで成長するために意識したこと
prgckwb
2
320
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
4
3k
はじめてのWDM
miyukichi_ospf
1
140
AI Agent SaaS を支える自社仮想化基盤への挑戦と実運用 / ai-agent-saas-virtualization
flatt_security
2
3.8k
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
2
620
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
210
「最後に責任を取るのはチーム」— 人間のPRレビューを最小化してアップデートしたメンタルモデル
jnishime_dresscode
0
600
関数型の考えを TypeScript に持ち込んで、テストしやすい純粋関数を増やす / Pure at the Core, Effects at the Edge: Bringing Functional Thinking into TypeScript
kaminashi
1
110
Featured
See All Featured
KATA
mclloyd
PRO
35
15k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
Mobile First: as difficult as doing things right
swwweet
225
10k
Odyssey Design
rkendrick25
PRO
2
730
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
820
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
260
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
360
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