8. The Workshop
● Raw need
ในการโอนเงินแต่ละครั้ง ผู้ใช้จะต้องระบุหมายเลขบัญชี
ปลายทางที่ต้องการโอน โดยยอดเงินที่โอนต้องไม่ต่ำกว่ายอดเงินขั้นต่ำ
ในการโอนซึ่งถูกกำหนดโดยเจ้าหน้าที่ และในการโอนเงินลูกค้า
จะถูกหักค่าธรรมเนียมตามอัตราที่ธนาคารกำหนด
And etc.
9. The Workshop
● Which is our domain model?
Account
TransferReceipt
Lab Step1
10. Service
● Which is our service?
ในการโอนเงินแต่ละครั้ง ผู้ใช้จะต้องระบุหมายเลขบัญชี
FeePolicy
AccRepository(DAO)
ปลายทางที่ต้องการโอน โดยยอดเงินที่โอนต้องไม่ต่ำกว่ายอดเงินขั้นต่ำ
>>
ncy
nde
epe
< D หน้าที่ และในการโอนเงินลูกค้า
ในการโอนซึ่งถูกกำหนดโดยเจ้า
<
จะถูกหักค่าธรรมเนียมตามอัตราที่ธนาคารกำหนด
<< Depe
n dency >
>
TransferService
11. Jigsaw
How do we know what our service should be like if we don't try to use it?
FeePolicy use
? AccRepository(DAO)
>
test test
y>
ndenc
Depe
<<
?
<< Depe
ndency
>>
test
use
TransferService
FeePolicy
Lab Step2 ->
13. Service
● What's next?
FeePolicy
AccRepository(DAO)
>>
ncy
nde
Depe
<<
?
<< Depe
n dency >
>
TransferService
14. Trouble
● How to write unit test which result not depend on dependency?
FeePolicy
? AccRepository(DAO)
>>
ncy
nde
Depe
<<
?
<< Depe
n dency >
>
?
TransferService
Able to control.
15. Solution
● Use anything that I can control.
– Static stub (utility, fake, dummy class)
– Dynamic stub
Lab Step3 ->
19. The Workshop
FeePolicy
AccRepository(DAO)
>>
de ncy
n
Depe
<<
<< Depe
n dency >
>
TransferService
New implemention of interface FeePolicy !!
All right I'm ok. FeePolicy was depended on me through interface.
Lab Step4
21. The Workshop
FeePolicy
TimeService
Services at present?
>>
cy
den
en
Dep
<< >
ency >
<< Depend
?
<<
De
pe
nd
en
cy
>> AccRepository(DAO)
TransferService
Lab Step5 >
23. Service
Services at present
TimeService TimeService
use FeePolicy
>
y>
nc test
nde test
pe
De
<<
<< Dependency >>
?
<<
De
pe
nd test
use ency
>>
AccRepository(DAO)
TransferService
24. Use the Service
TransferService TimeService
Refactoring
Caller ?
Must change
TransferService
AOP Proxy
Caller
TimeService
25. Refactoring
TimeService
TransferServiceTest use
test test
? Call
test
use
TransferService
I'm sure about my work.
How do I verify TransferService calling TimeService right?
26. Trouble
● How do I know ?
– TransferService call TimeService really.
– In the test, I can't control 'time', TransferService sents to
TimeService.
TimeService
TransferServiceTest
TransferService
Test call
all
C
TransferReceipt transfer(...) {
...
if (timeService.isServiceAvailable(new LocalTime())) {
...
}
}
Can't control
27. Solution
● Use anything that I can control.
– Static mock (special class)
– Dynamic mock
28. The Workshop
TransferServiceTest
Call
? ?
TransferService TimeService
Able to capture TransferService behavior
Lab Step6 >