Slide 1

Slide 1 text

"OESPJE5FTUJOH#PPUDBNQ )BOET0O "OESPJE@5FTUJOH@#$

Slide 2

Slide 2 text

w "OESPJE5FTUJOH#PPUDBNQ(SPVQ w IUUQBOESPJEUFTUJOH CPPUDBNQDPOOQBTTDPN w "OESPJE5FTUJOH#PPUDBNQ w IUUQBOESPJEUFTUJOH CPPUDBNQDPOOQBTTDPNFWFOU

Slide 3

Slide 3 text

ࠓճར༻͢Δ؀ڥ

Slide 4

Slide 4 text

w "OESPJE4UVEJP w IUUQTHJUIVCDPNTSZN5FTU)BOET0O w HJUDMPOFHJU!HJUIVCDPNTSZN 5FTU)BOET0OHJU w HJUDPFYBNQMFྫ୊ϒϥϯν w HJUDPBOTXFSղ౴ྫϒϥϯν

Slide 5

Slide 5 text

ΞδΣϯμ

Slide 6

Slide 6 text

w ͳͥςετΛॻ͘ͷ͔ w ςετͷछྨ w +6OJU w .PDLJUP w 1PXFS.PDL w %PHHFS 6*ςετ͸ ࣍ճϋϯζΦϯΛ ָ͓͠Έʹʂ

Slide 7

Slide 7 text

ͳͥςετΛॻ͘ͷ͔

Slide 8

Slide 8 text

w ϩδοΫͷݕূ w ࢓༷มߋ΁ͷ௥ै w σάϨͷݕग़ w ઃܭͷݟ௚͠ͷ͖͔͚ͬ

Slide 9

Slide 9 text

ςετͷछྨ

Slide 10

Slide 10 text

w ୯ମςετ 6OJU5FTU w ݁߹ςετ *OUFHSBUJPO5FTU w Ϣʔβड͚ೖΕςετ 6TFS"DDFQUBODF5FTU w ͦͷଞɺෛՙςετɾηΩϡϦςΟςετ౳

Slide 11

Slide 11 text

6OJU5FTU w ϓϩάϥϚ͕࣮૷ w ϝιου΍ΫϥεʹରʹରԠ w ࣗಈ࣮ߦ w ߴ଎ w "OESPJEͷ৔߹ɺ࣮ػ؀ڥͰͳ͍͜ͱ͕ଟ͍

Slide 12

Slide 12 text

*OUFHSBUJPO5FTU w 6*ʹର͢ΔࣗಈςετΛؚΉ w ࣮ࡍͷը໘ભҠ΍*0ॲཧɺωοτϫʔΫ௨৴Λߦ ͏͜ͱ΋ଟ͍ w ࣮ػʢΤϛϡϨʔλؚΉʣ࣮ߦ ఆٛ΍ӡ༻͸ ݱ৔ʹΑͬͯҧ͏

Slide 13

Slide 13 text

ड͚ೖΕςετ w ൃ஫ݩɺϚωʔδϟɾσΟϨΫλ͕֬ೝ w 2"͞ΜɺςελʹΑΔ֬ೝ w ଟ͘ͷ৔߹खಈ ఆٛ΍ӡ༻͸ ݱ৔ʹΑͬͯҧ͏

Slide 14

Slide 14 text

ͦͷଞ w ෛՙςετ w ηΩϡϦςΟςετ w ͦͷଞॾʑ

Slide 15

Slide 15 text

+6OJU

Slide 16

Slide 16 text

w "OESPJEͷ6OJU5FTUͷσϑΝΫτελϯμʔυ w "OESPJE4UVEJPҎ߱Λ࢖͍ͬͯΕ͹Կ΋͠ͳ͘ ͯ΋ར༻Մೳ w Ξϊςʔγϣϯϕʔε w +7.؀ڥͷΈͰಈ࡞͠ඇৗʹߴ଎

Slide 17

Slide 17 text

CVJMEHSBEMF EFQFOEFODJFT\ DPNQJMFpMF5SFF EJSMJCT JODMVEF<KBS> UFTU$PNQJMFKVOJUKVOJU DPNQJMFDPNBOESPJETVQQPSUBQQDPNQBUW ^

Slide 18

Slide 18 text

+6OJUͷجຊ

Slide 19

Slide 19 text

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

Slide 24

Slide 24 text

Assert.assertThat(1 + 1, Matchers.is(2));
 assertThat("MIKE", is(not("STEVE")));
 assertThat(1000L, is(instanceOf(Integer.class)));

Slide 25

Slide 25 text

EFQFOEFODJFT\ UFTU$PNQJMFKVOJUKVOJU UFTU$PNQJMFPSHIBNDSFTUIBNDSFTUMJCSBSZ ^

Slide 26

Slide 26 text

Α͘࢖͏.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)); // ͜Μͳ͜ͱ͸Ͱ͖ͳ͍ʂʂ
 }
 }

Slide 33

Slide 33 text

࢖͍ํ RandomIntGenerator randomIntGenerator = Mockito.mock(RandomIntGenerator.class);
 Mockito.when(randomIntGenerator.generate()).thenReturn(123);

Slide 34

Slide 34 text

w ଞʹ΋!.PDLΞϊςʔγϣϯΛ࢖͏΍Γํ͕͋Δ

Slide 35

Slide 35 text


 @Mock
 RandomIntGenerator randomIntGeneratorWithAnnotation;
 
 @Before
 public void setUp() {
 MockitoAnnotations.initMocks(this);
 Mockito.when(randomIntGeneratorWithAnnotation.generate()).thenReturn(456);
 }

Slide 36

Slide 36 text

՝୊ 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");

Slide 40

Slide 40 text

EFQFOEFODJFT\ UFTU$PNQJMFKVOJUKVOJU UFTU$PNQJMFPSHIBNDSFTUIBNDSFTUMJCSBSZ UFTU$PNQJMFPSHNPDLJUPNPDLJUPDPSF ^

Slide 41

Slide 41 text

.PDLJUPTQZ

Slide 42

Slide 42 text

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 pOBMDMBTT΍TUBUJDNFUIPEΛϞοΫͰ͖Δ 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);
 }
 
 }

Slide 60

Slide 60 text

@Singleton
 @Component(modules = ApplicationModule.class)
 public interface ApplicationComponent {
 ActivityComponent activityComponent(ActivityModule module);
 }

Slide 61

Slide 61 text

public ApplicationComponent getComponent() {
 return applicationComponent;
 }
 
 @Override
 public void onCreate() {
 super.onCreate();
 
 applicationComponent = DaggerApplicationComponent.builder()
 .applicationModule(new ApplicationModule(this))
 .build(); }

Slide 62

Slide 62 text

public class BaseActivity extends AppCompatActivity {
 private ActivityComponent activityComponent;
 
 /**
 * {@link android.app.Activity}ͷґଘੑάϥϑΛฦ͢
 *
 * @return
 */
 protected ActivityComponent getComponent() {
 if (activityComponent == null) {
 MyApplication myApplication = (MyApplication) getApplication();
 activityComponent = myApplication.getComponent().activityComponent(new ActivityModule(this));
 }
 return activityComponent;
 }
 }

Slide 63

Slide 63 text

public class ChatActivity extends BaseActivity {
 
 @Inject
 MessageHelper messageHelper; // ҎԼུ }

Slide 64

Slide 64 text

w %BHHFSΛ࢖࣮ͬͨફతͳྫ͸OVNBࢯʹҾ͖ܧ͗ ·͢ʂ