Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JMockit.pdf

130

 JMockit.pdf

Avatar for Takahiro Shigemoto

Takahiro Shigemoto

May 21, 2015
Tweet

Transcript

  1. +.PDLJUษڧձ ໨࣍ w ϞοΫϥΠϒϥϦΛ࢖͏ཧ༝ w +.PDLJUΛ࢖͏ཧ༝ w +.PDLJU͕ఏڙ͢Δ"1* w ϏϔΠϏΞۦಈ։ൃςετ

    w ঢ়ଶϕʔεͷςετ w ελϒɺϑΣΠΫɺϞοΫɺεύΠ w έʔεผϞοΫͷར༻ํ๏ w TUBUJDϝιουͷϞοΫ w QSJWBUFϝιουͷϞοΫ w ίϯετϥΫλͷϞοΫ w Ҿ਺ʹԠͨ͡ϞοΫಈ࡞ͷมߋ w ݺͼग़͠ճ਺ʹԠͨ͡ϞοΫಈ࡞ͷมߋ w ෦෼ϞοΫ w ࢀߟαΠτ౳ 
  2. +.PDLJUษڧձ +.PDLJUΛ࢖͏ཧ༝ʢ̍ʣ w ैདྷͷϞοΫϥΠϒϥϦͷ໰୊ w ͜Ε·ͰͷϞοΫϥΠϒϥϦʢ&BTZ.PDLɺK.PDLɺ .PDLJUPɺ6OJUJMT.PDLͳͲʣͰ͸ɺҎԼͷ΋ͷΛϞο ΫͰ͖ͳ͔͕ͬͨɺ+.PDLJUͰ͸ग़དྷΔΑ͏ʹͳͬͨɻ w QSJWBUFpOBMTUBUJDϝιου

    w ςετର৅Ϋϥε͔ΒɺOFXͰੜ੒ͨ͠ґଘΫϥε w ͔͠͠ɺ1PXFS.PDLʴʢ&BTZ.PDLc.PDLJUPʣͰग़ དྷΔΑ͏ʹͳͬͨɻ w ˠػೳͷ๛෋͞ͱ୯ҰKBSͰग़དྷΔ؆ܿ͞ʹɺ+.PDLJU ͷ༏Ґੑ͕͋Δ͔ɻ 
  3. +.PDLJUษڧձ +.PDLJU͕ఏڙ͢Δ"1* w +.PDLJU͸ೋͭͷϞοΫ"1*Λఏڙ͢Δɻ w ̍ɽ&YQFDUBUJPOT"1* w #%%ʢϏϔΠϏΞۦಈ։ൃʣςετ༻ w ςετର৅ΦϒδΣΫτͷৼΔ෣͍ʢϝιουʣ

    Λςετ w ̎ɽ.PDLVQT"1* w ঢ়ଶϕʔεςετͱϑΣΠΫ࣮૷༻ w େ൒ͷέʔε͸&YQFDUBUJPOT"1*Ͱॻ͘͜ͱ͕ग़དྷΔ͕ɺ .PDLVQT"1*Ͱิ׬͢Δඞཁ͕͋Δέʔε΋͋Δɻ 
  4. +.PDLJUษڧձ ϏϔΠϏΞۦಈ։ൃςετʢ̍ʣ w ϏϔΠϏΞۦಈ։ൃςετ͸ɺҎԼͷϑΣʔζͰ࣮ߦ͞Ε Δɻ w ४උ "SSBOHF ʗ࣮ߦ "DU

    ʗݕূ "TTFSU Λ
 ʢظ଴͢ΔґଘΫϥεͷৼΔ෣͍ͷʣه࿥ʗϦϓϨΠʗݕ ূͱ΋ݴ͏ɻ @Test public void someTestMethod() { // 1. ४උɿςετର৅ΫϥεΛ࣮ߦՄೳʹ͢ΔͷʹඞཁͳԿ͔ɻ ... // 2. ࣮ߦɿ௨ৗɺpublicϝιουΛݺͿࣄʹΑͬͯɺςετର৅Ϋϥε͕࣮ߦ͞ΕΔɻ ... // 3. ݕূɿςετର৅Ϋϥε͕࣮ߦͨ͜͠ͱΛ֬ೝ͢ΔͨΊʹɺνΣοΫ͢Δඞཁͷ͋ΔԿ͔ɻ ... } 
  5. +.PDLJUษڧձ ϏϔΠϏΞۦಈ։ൃςετʢ̎ʣ w ϏϔΠϏΞۦಈ։ൃςετͷྫ public class XXDao { public String

    getXX() { return "XX"; } } public class XXLogic { public String getXX() { XXDao dao = new XXDao(); return dao.getXX(); } } 99-PHJD 99%BP 99-PHJD͸ 99%BPʹґଘ 
  6. +.PDLJUษڧձ ϏϔΠϏΞۦಈ։ൃςετʢ̏ʣ w ϏϔΠϏΞۦಈ։ൃςετͷྫ @Test public void testGetXX(@Mocked XXDao dao)

    { // ه࿥ϑΣʔζ String expectedResult = "YY"; new Expectations() {{ dao.getXX(); result = expectedResult; }}; // ϦϓϨΠϑΣʔζ XXLogic logic = new XXLogic(); String result = logic.getXX(); // ݕূϑΣʔζ new Verifications() {{ // dao#getXX()͸1ճ͚ͩݺ͹Εͨ dao.getXX(); minTimes = 1; maxTimes = 1; }}; assertThat(result, is(expectedResult)); } ͜ͷςετέʔεͷൣғͰ༗ ޮͳϞοΫΦϒδΣΫτ ʻه࿥ϑΣʔζʼ ґଘΫϥε99%BPͷɺ͜ͷς ετʹ͓͚Δ๬·͍͠ৼΔ෣͍ Λه࿥ ʻϦϓϨΠϑΣʔζʼ ςετର৅ΫϥεͷQVCMJDϝ ιουΛݺͼग़࣮ͯ͠ߦ͢Δ ʻݕূϑΣʔζʼ ҎԼೋ఺Λ֬ೝ͢Δɻ ɾϞοΫΦϒδΣΫτʢґଘΫ ϥεʣ͕ظ଴௨Γಈ࡞͔ͨ͠ ɾςετର৅Ϋϥε͕ظ଴௨Γ ͷ݁ՌΛฦ͔ͨ͠ 
  7. +.PDLJUษڧձ ঢ়ଶϕʔεςετʢ̎ʣ w ঢ়ଶϕʔεςετͷྫ import java.io.IOException; import java.net.Socket; public class

    SocketClient { public Socket connect(String host, int port) throws IOException { Socket s = new Socket(host, port); return s; } } 4PDLFU $MJFOU 4PDLFU 4PDLFU$MJFOU͸ 4PDLFUʹґଘ 
  8. +.PDLJUษڧձ ঢ়ଶϕʔεςετʢ̏ʣ w ঢ়ଶϕʔεςετͷྫ @Test public void testConnect() { //

    ه࿥ϑΣʔζ String expectedHost = "test.example.com"; int expectedPort = 1234; new MockUp<Socket>() { @Mock void $init(String host, int port) { assertThat(host, is(expectedHost)); assertThat(port, is(expectedPort)); } }; // ϦϓϨΠϑΣʔζ try { Socket s = new SocketClient().connect(expectedHost, expectedPort); } catch(IOException e) { fail(e.getMessage()); } } ϞοΫΦϒδΣΫτʢґଘΫ ϥεʀ4PDLFUʣʹਖ਼͍͠ύϥ ϝʔλ͕౉͞Ε͔ͨݕূ͢Δ  .PDLVQT"1*ͷ৔߹͸ɺ .PDL6QΫϥεΛOFXͨ͠ͱ͜ ΖͰϞοΫ͕༗ޮʹͳΔ
  9. +.PDLJUษڧձ ελϒɺϑΣΠΫɺϞοΫɺεύΠʢ̍ʣ w ૯শͯ͠ςετμϒϧͱ͍͏ɻ
 IUUQKBXJLJQFEJBPSHXJLJςετμϒϧ આ໌ ελϒ ςετର৅ʹʮؒ઀తͳೖྗʯΛఏڙ͢ΔͨΊʹ࢖͏ ˠఆ਺Λฦ͢ͳͲɺݺͼग़͠ݩʹԠͨ͡୯७ͳ࣮૷Λఏڙ͢Δ ϑΣΠΫ

    ࣮ࡍͷΦϒδΣΫτʹ͍ۙಇ͖Λ͢Δ͕ɺΑΓ୯७ͳ࣮૷Λ࢖͏ ࣮ࡍͷσʔλϕʔεΛஔ͖׵͑ΔΠϯϝϞϦσʔλϕʔεͳͲ ˠελϒͷҰछ͕ͩɺΑΓߴ౓ͳʢͨͩ͠ຊ൪ίʔυΑΓ͸୯७ͳʣ࣮૷Λఏڙ͢Δ ϞοΫ ςετର৅͔Βͷʮؒ઀తͳग़ྗʯΛݕূ͢ΔͨΊʹ࢖͏ ςετίʔυͷ࣮ߦલʹɺ͋Β͔͡Ίظ଴͢Δ݁ՌΛઃఆ͓ͯ͘͠ ˠελϒͷҰछ͕ͩɺݺͼग़͠ݩ͕ਖ਼͘͠ԼҐϞδϡʔϧΛར༻͍ͯ͠Δ͜ͱΛݕূ͢Δ εύΠ ςετର৅͔Βͷʮؒ઀తͳग़ྗʯΛݕূ͢ΔͨΊʹ࢖͏ ग़ྗΛه࿥͓ͯ͘͜͠ͱͰɺςετίʔυͷ࣮ߦޙʹɺ஋ΛऔΓग़ͯ͠ݕূͰ͖Δ ˠݺͼग़͠ݩͱԼҐϞδϡʔϧͷؒʹೖͬͯɺ஋Λऔಘ͠ɺݕূ͢Δ 
  10. +.PDLJUษڧձ ελϒɺϑΣΠΫɺϞοΫɺεύΠʢ̎ʣ w ϑΣΠΫͷྫ @Test public void testConnectFail(@Mocked Socket socket)

    throws IOException { // ه࿥ϑΣʔζ String expectedHost = "test.example.com"; int expectedPort = 1234; new Expectations() {{ new Socket(anyString, anyInt); result = new IOException("mockedConstructor"); }}; // ϦϓϨΠϑΣʔζ try { Socket s = new SocketClient().connect(expectedHost, expectedPort); fail(); } catch(IOException e) { // ྫ֎͕εϩʔ͞ΕΔ͜ͱΛظ଴ } } 4PDLFU઀ଓΤϥʔ͕ى͜ΔΑ ͏ɺϞοΫʢϑΣΠΫʣΛઃఆ ͢Δ 
  11. +.PDLJUษڧձ ελϒɺϑΣΠΫɺϞοΫɺεύΠʢ̏ʣ w εύΠͷྫ @Test public void testConnectSpy() { //

    ه࿥ϑΣʔζ String expectedHost = "www.yahoo.co.jp"; int expectedPort = 80; new MockUp<Socket>() { @Mock void close(Invocation invocation) throws IOException { // Ҿ਺Λίϯιʔϧʹग़ྗ System.out.println("close method invoked."); // ຊ෺ͷϝιουΛݺͿ invocation.proceed(); } }; // ϦϓϨΠϑΣʔζ try { Socket s = new SocketClient().connect(expectedHost, expectedPort); s.close(); } catch(IOException e) { fail(); DMPTFϝιου͕ݺ͹Εͨͱ͖ ʹɺίϯιʔϧʹϝοηʔδΛग़ ͯ͠ɺຊ෺ͷϝιουΛݺͿɻ 
  12. +.PDLJUษڧձ TUBUJDϝιουͷϞοΫ w ςετର৅Ϋϥε w ςετΫϥε @Test public void testStaticMethod(@Mocked

    StaticMethod staticMethod) { // ه࿥ϑΣʔζ String expectedResult = "mockedResult"; new Expectations() {{ StaticMethod.staticMethod(); result = expectedResult; }}; // ϦϓϨΠϑΣʔζ String result = StaticMethod.staticMethod(); // ݕূϑΣʔζ assertThat(result, is(expectedResult)); } public static String staticMethod() { return "abc"; } ΠϯελϯεϝιουͷϞοΫ ͱಉ͡΍Γํ 
  13. +.PDLJUษڧձ QSJWBUFϝιουͷϞοΫʢ̍ʣ w ςετର৅Ϋϥε public class PrivateMethod { private PrivateMethod()

    { } private final int privateMethod() { return 10; } private static final int privateStaticMethod() { return 20; } } 
  14. +.PDLJUษڧձ QSJWBUFϝιουͷϞοΫʢ̎ʣ w ςετΫϥε @Test public void testPrivateMethod(@Mocked PrivateMethod target)

    { // ه࿥ϑΣʔζ int expectedPrivateMethodResult = 11; int expectedPrivateStaticMethodResult = 21; new Expectations() {{ Deencapsulation.invoke(target, "privateMethod"); result = expectedPrivateMethodResult; Deencapsulation.invoke(PrivateMethod.class, "privateStaticMethod"); result = expectedPrivateStaticMethodResult; }}; // ϦϓϨΠϑΣʔζ PrivateMethod tested = Deencapsulation.newInstance(PrivateMethod.class); int privateMethodResult = Deencapsulation.invoke(tested, "privateMethod"); int privateStaticMethodResult = Deencapsulation.invoke(tested, "privateStaticMethod"); // ݕূϑΣʔζ assertThat(privateMethodResult, is(expectedPrivateMethodResult)); assertThat(privateStaticMethodResult, is(expectedPrivateStaticMethodResult)); } 
  15. +.PDLJUษڧձ ίϯετϥΫλͷϞοΫʢ̍ʣ w ςετΫϥε @Test public void testGetCurrentDate() { //

    ظ଴஋͸2015/05/05 Calendar c = Calendar.getInstance(); c.set(2015, 4, 5); Date expected = c.getTime(); // ه࿥ϑΣʔζ new MockUp<Date>() { @Mock public void $init() { this.getMockInstance().setTime(expected.getTime()); } }; // ϦϓϨΠϑΣʔζ String strDate = DateUtil.getCurrentDate(); // ݕূϑΣʔζ assertThat(strDate, is("2015/05/05")); } ίϯετϥΫλͷڍಈΛม͑Δ ʹ͸ɺ.PDLVQT"1*͕ඞཁɻ ʢྫ֎Λ౤͛Δ͚ͩͳΒɺ &YQFDUBUJPOT"1*Ͱ΋Մʣ 
  16. +.PDLJUษڧձ ίϯετϥΫλͷϞοΫʢ̎ʣ w ίϯετϥΫλͷεύΠʢϥούʔΛඃͤΔʣ public static Date getDateInstance() { return

    new Date(); } public static Date getDateInstance(long time) { return new Date(time); } @Test public void testConstructor2() throws IOException { // ه࿥ϑΣʔζ new MockUp<DateWrapper>() { @Mock Date getDateInstance(Invocation inv) { System.out.println("getDateInstance"); return inv.proceed(); } @Mock Date getDateInstance(Invocation inv, long time) { System.out.println("getDateInstance(" + time + ")"); return inv.proceed(); } }; JOJUͰQSPDFFEͯ͠΋ಈ࡞͠ͳ ͍Β͍͠ɻɻ 
  17. +.PDLJUษڧձ Ҿ਺ʹԠͨ͡ϞοΫಈ࡞ͷมߋʢ̍ʣ w ςετΫϥε @Test public void testSystemGetProperties(@Mocked System system)

    { // ه࿥ϑΣʔζ new Expectations() {{ System.getProperty("os.name"); result = "Mocked os.name"; System.getProperty("user.name"); result = "Mocked user.name"; }}; // ϦϓϨΠϑΣʔζ String osName = System.getProperty("os.name"); String userName = System.getProperty("user.name"); // ݕূϑΣʔζ assertThat(osName, is("Mocked os.name")); assertThat(userName, is("Mocked user.name")); } ಉ͡4ZTUFNHFU1SPQFSUZϝ ιουʹରͯ͠ɺҾ਺ʹԠͨ͡Ϟο Ϋಈ࡞Λఆ͍ٛͯ͠Δɻ 
  18. +.PDLJUษڧձ Ҿ਺ʹԠͨ͡ϞοΫಈ࡞ͷมߋʢ̎ʣ w Ҿ਺ͷϚονʹ࢖͑Δఆ਺ ܕ ఆ਺ 0CKFDU BOZ #PPMFBO BOZ#PPMFBO

    #ZUF BOZ#ZUF $IBSBDUFS BOZ$IBS %PVCMF BOZ%PVCMF 'MPBU BOZ'MPBU *OUFHFS BOZ*OU -POH BOZ-POH 4IPSU BOZ4IPSU 4USJOH BOZ4USJOH 
  19. +.PDLJUษڧձ ݺͼग़͠ճ਺ʹԠͨ͡ϞοΫಈ࡞ͷมߋʢ̍ʣ w ݺͼग़͠ճ਺Ͱ໭Γ஋ͷ੾Γସ͑ @Test public void testSystemGetProperties(@Mocked System system)

    { // ه࿥ϑΣʔζ new Expectations() {{ System.getProperty("os.name"); returns("Mocked os.name", "Mocked os.name2"); }}; // ϦϓϨΠϑΣʔζ String osName = System.getProperty("os.name"); String osName2 = System.getProperty("os.name"); String osName3 = System.getProperty("os.name"); // ݕূϑΣʔζ assertThat(osName, is("Mocked os.name")); assertThat(osName2, is("Mocked os.name2")); assertThat(osName3, is("Mocked os.name2")); } SFUVSOTΛ࢖͏͜ͱͰɺݺͼग़͠ ճ਺ʹԠͨ݁͡ՌΛฦͤΔ ʢճ໨Ҏ߱͸ճ໨ͱಉ͡ʣ 
  20. +.PDLJUษڧձ ݺͼग़͠ճ਺ʹԠͨ͡ϞοΫಈ࡞ͷมߋʢ̎ʣ w ݺͼग़͠ճ਺ͰϞοΫʗϦΞϧͷ੾Γସ͑ @Test public void testSystemGetPropertiesMockupAPI() { String

    realOsName = System.getProperty("os.name"); // ه࿥ϑΣʔζ new MockUp<System>() { @Mock String getProperty(Invocation inv, String key) { if(inv.getInvocationCount() < 2) { return "Mocked property"; } else { return inv.proceed(); } } }; // ϦϓϨΠϑΣʔζ String osName = System.getProperty("os.name"); String osName2 = System.getProperty("os.name"); // ݕূϑΣʔζ assertThat(osName, is("Mocked property")); assertThat(osName2, is(realOsName)); } ճ໨·Ͱ͸ϞοΫͨ݁͠Ռɺ ճ໨Ҏ߱͸ϦΞϧϝιουͷ݁Ռ Λฦ͢ɻ ˞*OWPDBUJPO͸൪໨ͷҾ਺ʹ͢ Δඞཁ͕͋Δɻ ˞ޙड़ͷҾ਺ʹΑͬͯϞοΫʗϦ ΞϧΛݺͼ෼͚Δํ๏Λ૊Έ߹Θ ͤΔ͜ͱ΋Մೳ 
  21. +.PDLJUษڧձ ෦෼ϞοΫʢ̍ʣ w ϝιου୯ҐͰϞοΫʗϦΞϧͷ੾Γସ͑ @Test public void testPartialMock(@Mocked("getProperty") System system)

    { // ه࿥ϑΣʔζ new Expectations() {{ System.getProperty(“os.name"); result = "Mocked os.name"; }}; // ϦϓϨΠϑΣʔζ String osName = System.getProperty("os.name"); String realOsName = System.getProperties().getProperty("os.name"); // ݕূϑΣʔζ assertThat(osName, is("Mocked os.name")); System.out.println(realOsName); } HFU1SPQFSUZϝιουͷΈϞο Ϋ͞ΕΔɻͦΕҎ֎ͷϝιου͸ ϦΞϧϝιου͕ݺ͹ΕΔɻ 
  22. +.PDLJUษڧձ ෦෼ϞοΫʢ̎ʣ w Πϯελϯε୯ҐͰϞοΫʗϦΞϧͷ੾Γସ͑ @Test public void testPartialMock(@Injectable Date date)

    { // ه࿥ϑΣʔζ new Expectations() {{ date.getTime(); result = 1234567890L; }}; // ϦϓϨΠϑΣʔζ long mockedTime = date.getTime(); long realTime = new Date(2234567890L).getTime(); // ݕূϑΣʔζ assertThat(mockedTime, is(1234567890L)); assertThat(realTime, is(2234567890L)); } !.PDLͷ୅ΘΓʹ!*OKFDUBCMF Λ࢖͏ͱɺͦͷΠϯελϯεͷΈ ϞοΫ͞ΕΔɻ ϞοΫ͞Ε͍ͯΔEBUFͱ͸ผʹ ΠϯελϯεΛ࡞੒ͨͨ͠ΊɺϞο Ϋ͞Ε͍ͯͳ͍ϦΞϧ࣮૷͕ݺ͹ ΕΔɻ 
  23. +.PDLJUษڧձ ෦෼ϞοΫʢ̏ʣ w Ҿ਺ʹԠͯ͡ϞοΫʗϦΞϧͷ੾Γସ͑ @Test public void testDynamicPartialMock() { //

    ه࿥ϑΣʔζ new MockUp<System>() { @Mock String getProperty(Invocation inv, String key) { if("os.name".equals(key)) { return "Mocked os.name"; } else { return inv.proceed(); } } }; // ϦϓϨΠϑΣʔζ String osName = System.getProperty("os.name"); String realUserName = System.getProperty("user.name"); // ݕূϑΣʔζ assertThat(osName, is("Mocked os.name")); System.out.println(realUserName); } HFU1SPQFSUZϝιουͷҾ਺ ͕zPTOBNFzͷ৔߹͸ϞοΫɺͦ ΕҎ֎ͷ৔߹͸ϦΞϧϝιουͷ ݁ՌΛฦ͢ɻ ˞*OWPDBUJPO͸൪໨ͷҾ਺ʹ͢ Δඞཁ͕͋Δɻ 
  24. +.PDLJUษڧձ ࢀߟαΠτ౳ w +.PDLJU.PDLJOH5PPMLJU$PNQBSJTPO.BUSJY w IUUQKNPDLJUPSH.PDLJOH5PPMLJU$PNQBSJTPO.BUSJYIUNM w +.PDLJU5VUPSJBM w IUUQKNPDLJUPSHUVUPSJBMIUNM

    w QPXFSNPDL w IUUQTDPEFHPPHMFDPNQQPXFSNPDL w ςετμϒϧ8JLJQFEJB w IUUQKBXJLJQFEJBPSHXJLJςετμϒϧ