w NPEVMFTSDUFTUKBWBQBDLBHF5BSHFU5FTUKBWB
w !#FGPSFʜॳظԽ
w !"GUFSʜޙॲཧ
w !5FTUʜςετίʔυຊମ
Slide 20
Slide 20 text
public class CalculatorTest {
private Calculator calculator;
@Before
public void setUp() {
calculator = new Calculator();
}
@After
public void tearDown() {
}
@Test
public void ͠ࢉ͕ਖ਼͘͠ग़དྷΔ() throws Exception {
double expected = calculator.add(1.0, 2.0);
assertTrue(expected == 3.0);
}
}
Slide 21
Slide 21 text
"TTFSUJPO
w "TTFSUBTTFSU5SVF CPPMFBODPOEJUJPO
w "TTFSUBTTFSU&RVBMT 0CKFDUFYQFDUFE
0CKFDU
BDUVBM
Slide 22
Slide 22 text
՝
w
)FMMP+6OJUΛͤ͞Α͏ʂ
w IUUQTHJUIVCDPNTSZN5FTU)BOET0OCMPC
FYBNQMFKVOJUTSDUFTUKBWBVTTIJSPZBNBBOESPJE
KVOJU)FMMP+6OJUKBWB
w
$BMDVMBUPS5FTUΛͤ͞Α͏ʂ
w IUUQTHJUIVCDPNTSZN5FTU)BOET0OCMPC
FYBNQMFKVOJUTSDUFTUKBWBVTTIJSPZBNBBOESPJE
KVOJU$BMDVMBUPS5FTUKBWB
Slide 23
Slide 23 text
.BUDIFS
w .BUDIFSʜʮͲΜͳঢ়ଶ͔ʯΛද͢
w "TTFSUBTTFSU5IBU BDUVBM
NBUDIFS
w )BNDSFTUͷ.BUDIFST͕༗໊
w IUUQIBNDSFTUPSH+BWB)BNDSFTU
Α͘͏.BUDIFS
w JT
ʜಉ
w OPU
ʜ൱ఆ
w OVMM7BMVF
OPU/VMM7BMVF
ʜ/VMMʗඇ/VMM
w TBNF*OTUBODF
ʜಉҰΠϯελϯε
w JOTUBODF0G
ʜಉҰ͔αϒΫϥεͷΠϯελϯε
w TUBSUT8JUI
FOET8JUI
ʜࢦఆจࣈྻͰ࢝·ΔʗऴΘΔ
w DPOUBJOT4USJOH
ʜࢦఆจࣈྻؚ͕·ΕΔ
w JT&NQUZ4USJOH
ʜۭจࣈྻ
Slide 27
Slide 27 text
w HSFBUFS5IBO
HSFBUFS5IBO0S&RVBM5P
ʜΑΓେ͖͍ʗҎ
্
w MFTT5IBO
MFTT5IBO0S&RVBM5P
ʜΑΓখ͍͞ʗҎԼ
w DMPTF5P
ʜࢦఆͷൣғ͔Ͳ͏͔
w BTTFSU5IBU
JT DMPTF5P
ʙൣ
ғͳͷͰUSVF
w ͦͷଞɺϦετϚοϓ༻ͷ.BUDIFSଟ
w ࢀߟ
IUUQRJJUBDPNPQFOHMJUFNT
FEBCFGBB
Slide 28
Slide 28 text
՝
w
$BMDVMBUPS5FTU8JUI)BNDSFTU.BUDIFSTΛ
ͤ͞Α͏ʂ
w IUUQTHJUIVCDPNTSZN5FTU)BOET0OCMPC
FYBNQMFKVOJUTSDUFTUKBWBVTTIJSPZBNB
BOESPJEKVOJU
$BMDVMBUPS5FTU8JUI)BNDSFTU.BUDIFSTKBWB
Slide 29
Slide 29 text
.PDLJUP
Slide 30
Slide 30 text
w ϝιουΛ͋Β͔͡ΊܾΊΒΕͨ݁Ռ͕ฦΔΑ͏ʹ
ϞοΫΞοϓ͢Δ
w *0ɺωοτϫʔΫΞΫηεɺϥϯμϜੑͷഉআ
w ͦͷͰςετ͍߲ͨ͠ʹूத͢Δ
w .PDLJUP͕σϑΝΫτελϯμʔυ
Slide 31
Slide 31 text
public class RandomIntGenerator {
private final Random random = new Random();
public int generate() {
return random.nextInt(Integer.MAX_VALUE);
}
}
Slide 32
Slide 32 text
public class RandomIntGeneratorTest {
private RandomIntGenerator randomIntGenerator;
@Before
public void setUp() {
randomIntGenerator = new RandomIntGenerator();
}
@After
public void tearDown() {
}
@Test
public void generateͷ݁Ռ() {
int expected = randomIntGenerator.generate();
assertThat(expected, is(1)); // ͜Μͳ͜ͱͰ͖ͳ͍ʂʂ
}
}
՝
w
3BOEPN*OU(FOFSBUPS5FTUΛͤ͞Α͏ʂ
w IUUQTHJUIVCDPNTSZN5FTU)BOET0OCMPC
FYBNQMFNPDLJUPTSDUFTUKBWBVTTIJSPZBNB
BOESPJENPDLJUP
3BOEPN*OU(FOFSBUPS5FTUKBWB
w
!.PDLΞϊςʔγϣϯΛ͏ํ๏ࢼͯ͠ΈΑ
͏ʂ
Slide 37
Slide 37 text
.PDLJUPWFSJGZ
Slide 38
Slide 38 text
w .PDLΦϒδΣΫτɺݺͼग़͠Λͯ͢هԱͯ͠
͍Δ
w ݺͼग़͞ΕͨϝιουɺճɺҾͳͲΛ
.PDLJUPWFSJGZͰݕূͰ͖Δ
Slide 39
Slide 39 text
Mockito.verify(mockStrings, Mockito.times(1)).add("FOO");
Mockito.verify(mockStrings, Mockito.atLeast(1)).add("BAR");
Mockito.verify(mockStrings).add("BAZ");
Mockito.verify(mockStrings, Mockito.never()).add("I AM NOT CALLED");
w ΦϒδΣΫτΛͦͷ··ϞοΫΞοϓ͢Δ
.PDLJUPNPDLʹର͠ɺTQZ࣮ΦϒδΣΫτͷҰ
෦ͷΈΛࠩ͠ସ͑ΒΕΔ
w TQZΦϒδΣΫτNPDLͱಉ༷WFSJGZͰݕূͰ͖Δ
w TQZͰΛฦ͢ͱ͖
XIFO NPDL
UIFO3FUVSO WBMVF
Ͱͳ͘
EP3FUVSO WBMVF
XIFO NPDL
NFUIPE
Λ͏
w !.PDLಉ༷ɺ!4QZΞϊςʔγϣϯ͕ར༻Մೳ
Slide 43
Slide 43 text
List realList = new ArrayList<>();
List spyList = spy(realList);
doReturn(38).when(spyList).size();
Slide 44
Slide 44 text
ϑΟʔϧυʹ.PDLΛ
ૹΓ͜Ή
Slide 45
Slide 45 text
public class StringCollector {
private List strings = new ArrayList<>();
public void add(@NonNull String string) {
strings.add(string);
}
public int size() {
return strings.size();
}
}
Slide 46
Slide 46 text
w ϑΟʔϧυͷ"SSBZ-JTUʹͲ͏ͬͯϞοΫΛૹΓ
ࠐΉʁ
w
TFUUFSΛ༻ҙͯ͠!7JTJCMF'PS5FTUJOH
w
!*OKFDU.PDLTΞϊςʔγϣϯ
Slide 47
Slide 47 text
public class StringCollector {
private List strings = new ArrayList<>();
public void add(@NonNull String string) {
strings.add(string);
}
public int size() {
return strings.size();
}
@VisibleForTesting
void setStrings(List strings) {
this.strings = strings;
}
}
Slide 48
Slide 48 text
!*OKFDU.PDLT
@Mock
List mockStringsForInject;
@InjectMocks
StringCollector stringCollectorForInject;
Slide 49
Slide 49 text
՝
w
4USJOH$PMMFDUPS5FTUΛͤ͞Α͏ʂ
w IUUQTHJUIVCDPNTSZN5FTU)BOET0OCMPC
FYBNQMFNPDLJUPTSDUFTUKBWBVTTIJSPZBNB
BOESPJENPDLJUP4USJOH$PMMFDUPS5FTUKBWB
w
!4QZΞ
ϊςʔγϣϯΛ͏ํ๏ࢼͯ͠ΈΑ͏ʂ
w
!*OKFDU.PDLTΞϊςʔγϣϯͬͯΈΑ͏ʂ
Slide 50
Slide 50 text
.PDLJUPࢀߟϦϯΫ
w IUUQFUDIBUFOBCMPHDPNFOUSZ
w IUUQFUDIBUFOBCMPHDPNFOUSZ
w IUUQFUDIBUFOBCMPHDPNFOUSZ
Slide 51
Slide 51 text
1PXFS.PDL
Slide 52
Slide 52 text
w ࠓճ͕࣌ؒͳ͍ͷͰ৮Ε·ͤΜ
w pOBMDMBTTTUBUJDNFUIPEΛϞοΫͰ͖Δ
w Ϋϥεϩʔμʹհೖ͢ΔͷͰϋϚϦϙΠϯτ͕͍ͬ
ͺ͍͋Δ
w ಟʹༀʹͳΓ͏Δ
Slide 53
Slide 53 text
ςετ͍͢͠ߏԽ
Slide 54
Slide 54 text
w DPNNPOϞδϡʔϧͷ6TFS*OGP6TFS$BTFͷղઆ
w IUUQTHJUIVCDPNTSZN5FTU)BOET0OCMPC
FYBNQMFDPNNPOTSDNBJOKBWBVT
TIJSPZBNBBOESPJEDPNNPOVTFDBTF
6TFS*OGP6TF$BTF*NQMKBWB
Slide 55
Slide 55 text
՝
w
6TFS*OGP6TF$BTF*NQM5FTUΛͤ͞Α͏ʂ
w IUUQTHJUIVCDPNTSZN5FTU)BOET0OCMPC
FYBNQMFNPDLJUPTSDUFTUKBWBVTTIJSPZBNB
BOESPJENPDLJUP
6TFS*OGP6TF$BTF*NQM5FTUKBWB
w ඇಉظॲཧͷςετͷώϯτɿ$PVOU%PXO-BUDI
Slide 56
Slide 56 text
w ςετΛͳΔ͍͘͢͠ߏʹ͢Δ
w దʹΠϯλϑΣʔεΛΔ
w ґଘੑΛίϯετϥΫλͰ͢
w %*ίϯςφΛ͏
Slide 57
Slide 57 text
%BHHFS
Slide 58
Slide 58 text
w (PPHMF͕ϝϯςφϯε͍ͯ͠Δ%*ίϯςφ
w IUUQHPPHMFHJUIVCJPEBHHFS
w .PEVMFͱ$PNQPOFOUΛͬͯґଘੑͷάϥϑΛ
ఆٛ͠ɺ!*OKFDUΞϊςʔγϣϯͰ࣮Πϯελϯε
Λࠩ͠ࠐΉ
w ςετ࣌ʹΠϯελϯεΛΓସ͑ΒΕΔͳͲॊೈ
ੑ͕૿͢
Slide 59
Slide 59 text
@Module
public class ApplicationModule {
@Singleton
@Provides
public MessageHelper provideMessageHelper(Context context) {
return MessageHelper.getInstance(context);
}
}