Slide 1

Slide 1 text

JUnitͰಆ͏ϨΨγʔίʔυվળ ++6($$$4QSJOH ᜊ౻༔ଠ!:VUB4BJUP

Slide 2

Slide 2 text

ࣗݾ঺հ w ᜊ౻༔ଠ w αʔόαΠυΤϯδχΞ؀ڥ੔උͱ͔΍ͬͯΔ w ϨΨγʔίʔυͱಆ͖ͬͯ·ͨ͠ɻ ݱࡏ΋  w 5XJUUFS!:VUB4BJUP

Slide 3

Slide 3 text

ηογϣϯ಺༰ w ಺༰ w +6OJUΛར༻ͯ͠ϨΨγʔίʔυΛվળ͢ΔͨΊʹࢲ͕औΓ૊Μ Ͱ͍Δ͜ͱΛ͝঺հ͠·͢ɻ w ໨ඪ w ೔ʑͷۀ຿ͰϨΨγʔίʔυʹۤ࿑͍ͯ͠Δਓʹɺ+6OJUΛར༻ ͨ͠ϦϑΝΫλϦϯάΛ஌ͬͯ΋Β͏ w ٕज़ෛ࠴Λ૿΍͞ͳ͍ͨΊʹςετίʔυΛνʔϜͷจԽʹऔΓ ೖΕ͍ͨͱࢥͬͯ΋Β͏

Slide 4

Slide 4 text

ϨΨγʔίʔυͷྫ ࢲ͸͍͔ͭ͘ͷγεςϜͰҎԼͷΑ͏ͳίʔυΛݟΔ͜ͱ͕ ͋Γ·ͨ͠ɻ /** * ൢചརӹܭࢉ * * @param price ঎඼୅ۚ * @param shippingSize ঎඼αΠζ * @return ച্ */ public Sales profitCalculate(int price, ShippingSize shippingSize) { if (price < 1_000) { throw new IllegalArgumentException("priceʹ͸1,000ԁҎ্Λઃఆ͍ͯͩ͘͠͞ɻ"); } Sales sales = new Sales(); sales.price = price; sales.profit = price; // ख਺ྉܭࢉ feeCalculate(sales); // ഑ૹྉܭࢉ deliveryFeeCalculate(sales, shippingSize); return sales; }

Slide 5

Slide 5 text

ϨΨγʔίʔυͷྫ ࢲ͸͍͔ͭ͘ͷγεςϜͰҎԼͷΑ͏ͳίʔυΛݟΔ͜ͱ͕ ͋Γ·ͨ͠ɻ /** * ൢചརӹܭࢉ * * @param price ঎඼୅ۚ * @param shippingSize ঎඼αΠζ * @return ച্ */ public Sales profitCalculate(int price, ShippingSize shippingSize) { if (price < 1_000) { throw new IllegalArgumentException("priceʹ͸1,000ԁҎ্Λઃఆ͍ͯͩ͘͠͞ɻ"); } Sales sales = new Sales(); sales.price = price; sales.profit = price; // ख਺ྉܭࢉ feeCalculate(sales); // ഑ૹྉܭࢉ deliveryFeeCalculate(sales, shippingSize); return sales; } ϝιουʹTBMFTΛ౉ͯ͠ ͜ͷϝιουͷதͰTBMFTΛߋ৽͍ͯ͠Δ

Slide 6

Slide 6 text

ϨΨγʔίʔυʹ৽͍͠ػೳΛ௥Ճ͢Δ Ͱ͸͜ͷίʔυʹػೳΛ௥Ճͯ͠Έ·͢ɻ ࠓ͚ͩʮख਺ྉແྉʯΩϟϯϖʔϯΛߦ͏ͱ͠·͢ɻ /** * ൢചརӹܭࢉ * * @param price ঎඼୅ۚ * @param shippingSize ঎඼αΠζ * @return ച্ */ public Sales profitCalculate(int price, ShippingSize shippingSize) { if (price < 1_000) { throw new IllegalArgumentException("priceʹ͸1,000ԁҎ্Λઃఆ͍ͯͩ͘͠͞ɻ"); } Sales sales = new Sales(); sales.price = price; sales.profit = price; // ख਺ྉܭࢉ feeCalculate(sales); // ഑ૹྉܭࢉ deliveryFeeCalculate(sales, shippingSize); return sales; }

Slide 7

Slide 7 text

৽͍͠ػೳΛ௥Ճ͢Δ ख਺ྉΛແྉʹ͢Δ͸͜͜Λ௚ͤ͹ྑ͍ͬΆ͍ /** * ൢചརӹܭࢉ * * @param price ঎඼୅ۚ * @param shippingSize ঎඼αΠζ * @return ച্ */ public Sales profitCalculate(int price, ShippingSize shippingSize) { if (price < 1_000) { throw new IllegalArgumentException("priceʹ͸1,000ԁҎ্Λઃఆ͍ͯͩ͘͠͞ɻ"); } Sales sales = new Sales(); sales.price = price; sales.profit = price; // ख਺ྉܭࢉ feeCalculate(sales); // ഑ૹྉܭࢉ deliveryFeeCalculate(sales, shippingSize); return sales; }

Slide 8

Slide 8 text

৽͍͠ػೳΛ௥Ճ͢Δ ख਺ྉܭࢉΛແྉʹ͢Δίʔυʹมߋ private void feeCalculate(Sales sales) { int rate; if (sales.price < 5_000) { rate = 20; } else if (sales.price < 10_000) { rate = 10; } else { rate = 5; } int fee = sales.price * rate / 100; sales.fee = fee; sales.profit = sales.profit - fee; } private void feeCalculate(Sales sales) { sales.fee = 0; } ݩͷίʔυ मਖ਼ޙͷίʔυ

Slide 9

Slide 9 text

৽͍͠ػೳΛ௥Ճ͢Δ ػೳվमͰ͖ͨʂ0,ʂ

Slide 10

Slide 10 text

৽͍͠ػೳΛ௥Ճ͢Δ ػೳվमͰ͖ͨʂ0,ʂ Μʁ ൢചརӹ͕૝ఆΑΓଟ͍ʁ

Slide 11

Slide 11 text

όάͷݪҼΛ֬ೝ͢Δ શ෦ͷίʔυΛݟͯΈ·͢ private void feeCalculate(Sales sales) { sales.fee = 0; } private void deliveryFeeCalculate(Sales sales, ShippingSize shippingSize) { int deliveryFee = switch (shippingSize) { case SMALL -> 100; case MEDIUM -> 200; case LARGE -> 300; }; // ഑ૹྉ͕300ԁҎ্ͳΒख਺ྉ͔Β100ԁׂҾ if (deliveryFee >= 300) { sales.fee -= 100; sales.profit += 100; } sales.deliveryFee = deliveryFee; sales.profit = sales.profit - deliveryFee; } // ख਺ྉܭࢉ feeCalculate(sales); // ഑ૹྉܭࢉ deliveryFeeCalculate(sales, shippingSize); return sales;

Slide 12

Slide 12 text

όάͷݪҼΛ֬ೝ͢Δ શ෦ͷίʔυΛݟͯΈ·͢ private void feeCalculate(Sales sales) { sales.fee = 0; } private void deliveryFeeCalculate(Sales sales, ShippingSize shippingSize) { int deliveryFee = switch (shippingSize) { case SMALL -> 100; case MEDIUM -> 200; case LARGE -> 300; }; // ഑ૹྉ͕300ԁҎ্ͳΒख਺ྉ͔Β100ԁׂҾ if (deliveryFee >= 300) { sales.fee -= 100; sales.profit += 100; } sales.deliveryFee = deliveryFee; sales.profit = sales.profit - deliveryFee; } // ख਺ྉܭࢉ feeCalculate(sales); // ഑ૹྉܭࢉ deliveryFeeCalculate(sales, shippingSize); return sales; ख਺ྉ͕ϚΠφεʹͳΔ

Slide 13

Slide 13 text

ϨΨγʔίʔυͱ͸ ࠓճͷίʔυʹ͸ҎԼͷΑ͏ͳ໰୊͕͋Γ·ͨ͠ɻ ɾίʔυΛमਖ਼͢ΔͱଞͷՕॴʹ·ͰӨڹͯ͠͠·͏ ɾίʔυͷཧղʹ͕͔͔࣌ؒΔ Մಡੑ͕௿͍  ࢲ͕ؔΘ͖ͬͯͨγεςϜͰ͸ɺ͜ͷΑ͏ͳίʔυ͕௕͍ظ ؒଘࡏ͠ɺվળ͞Εͣʹܧଓͯ͠ར༻͞Ε͍ͯ·ͨ͠ɻ ͜ͷΑ͏ͳঢ়ଶΛϨΨγʔίʔυͱࠓճ͸ݺͼ·͢ɻ

Slide 14

Slide 14 text

ͦ͏ͩϦϑΝΫλϦϯά͠Α͏ʂ

Slide 15

Slide 15 text

ͲͷΑ͏ʹमਖ਼͢Δʁ ෭࡞༻Λͳͯ͘͠ݺͼग़͠ݩϝιου ౰ϝιου ͰΫϥεͷ஋Λઃఆ͞ ͍ͤͨͰ͢ɻҎԼ͸मਖ਼ޙͷΠϝʔδ /** * ൢചརӹܭࢉ * * @param price ঎඼୅ۚ * @param shippingSize ঎඼αΠζ * @return ച্ */ public Sales profitCalculate(int price, ShippingSize shippingSize) { if (price < 1_000) { throw new IllegalArgumentException("priceʹ͸1,000ԁҎ্Λઃఆ͍ͯͩ͘͠͞ɻ"); } Sales sales = new Sales(); sales.price = price; // ख਺ྉܭࢉ int fee = feeCalculate(sales.price); // ഑ૹྉܭࢉ int deliveryFee = deliveryFeeCalculate(shippingSize); // ഑ૹྉ͕300ԁҎ্ͳΒख਺ྉ͔Β100ԁׂҾ if (deliveryFee >= 300) { fee = max(fee - 100, 100); } sales.fee = fee; sales.deliveryFee = deliveryFee; sales.profit = price - fee - deliveryFee; return sales; }

Slide 16

Slide 16 text

खಈͰͷςετ͸೉͍͠৔߹΋͋Δ ࠓճͷΑ͏ͳίʔυΛϦϑΝΫλϦϯάͯ͠΋ɺ σʔλͷ४උ͕େมɺܦ࿏͕ෳࡶͳͲͷཧ༝ͰखಈͰςετ ͢Δͷ΋೉͍͠৔߹΋͋Γɺόά͕ൃੜ͢ΔՄೳੑ͕͋Γ· ͢ɻ

Slide 17

Slide 17 text

खಈͰͷςετ͸೉͍͠৔߹΋͋Δ ࠓճͷΑ͏ͳίʔυΛϦϑΝΫλϦϯάͯ͠΋ɺ σʔλͷ४උ͕େมɺܦ࿏͕ෳࡶͳͲͷཧ༝ͰखಈͰςετ ͢Δͷ΋೉͍͠৔߹΋͋Γɺόά͕ൃੜ͢ΔՄೳੑ͕͋Γ· ͢ɻ +6OJUͰςετίʔυΛॻ͚͹ ҆શʹϦϑΝΫλϦϯάͰ͖·͢

Slide 18

Slide 18 text

ςετίʔυͷ࡞੒ ϦϑΝΫλϦϯάΛߦ͏લʹɺςετίʔυΛ࡞੒͠શͯ QBTT͢Δ͜ͱΛ֬ೝ͠·͢ɻ @Test void ഑ૹྉ͕300ԁ() { Sales actual = new SalesService().profitCalculate(1_000, ShippingSize.LARGE); assertEquals(1_000, actual.price); assertEquals(100, actual.fee); assertEquals(300, actual.deliveryFee); assertEquals(600, actual.profit); }

Slide 19

Slide 19 text

ϦϑΝΫλϦϯά͢Δ Ͱ͸ϦϑΝΫλϦϯά͠·͢ɻ /** * ൢചརӹܭࢉ * * @param price ঎඼୅ۚ * @param shippingSize ঎඼αΠζ * @return ച্ */ public Sales profitCalculate(int price, ShippingSize shippingSize) { if (price < 1_000) { throw new IllegalArgumentException("priceʹ͸1,000ԁҎ্Λઃఆ͍ͯͩ͘͠͞ɻ"); } Sales sales = new Sales(); sales.price = price; // ख਺ྉܭࢉ int fee = feeCalculate(sales.price); // ഑ૹྉܭࢉ int deliveryFee = deliveryFeeCalculate(shippingSize); sales.fee = fee; sales.deliveryFee = deliveryFee; sales.profit = price - fee - deliveryFee; return sales; }

Slide 20

Slide 20 text

ςετίʔυΛ࣮ߦ ϦϑΝΫλϦϯάΛϛεΔͱςετΤϥʔ͕ൃੜ͠·͢

Slide 21

Slide 21 text

मਖ਼͢Δ ޡ͍ͬͯͨՕॴΛमਖ਼͠·͢ɻ /** * ൢചརӹܭࢉ * * @param price ঎඼୅ۚ * @param shippingSize ঎඼αΠζ * @return ച্ */ public Sales profitCalculate(int price, ShippingSize shippingSize) { if (price < 1_000) { throw new IllegalArgumentException("priceʹ͸1,000ԁҎ্Λઃఆ͍ͯͩ͘͠͞ɻ"); } Sales sales = new Sales(); sales.price = price; // ख਺ྉܭࢉ int fee = feeCalculate(sales); // ഑ૹྉܭࢉ int deliveryFee = deliveryFeeCalculate(sales, shippingSize); // ഑ૹྉ͕300ԁҎ্ͳΒख਺ྉ͔Β100ԁׂҾ if (deliveryFee >= 300) { fee = max(fee - 100, 100); } sales.fee = fee; sales.deliveryFee = deliveryFee; sales.profit = price - fee - deliveryFee; return sales; } ͕͜͜࿙Ε͍ͯͨ

Slide 22

Slide 22 text

ςετίʔυΛ࣮ߦ ςετΛ࣮ߦͯ͠શͯQBTTͨ͠ΒϦϑΝΫλϦϯά੒ޭͰ ͢ɻ

Slide 23

Slide 23 text

͜ΕͰϨΨγʔίʔυΛվળ͍ͯͧ͘͠ʂ

Slide 24

Slide 24 text

͜ΕͰϨΨγʔίʔυΛվળ͍ͯͧ͘͠ʂ ͋Εʁվળ͍ͯ͠Δ͸ͣͳͷʹ ϨΨγʔίʔυશવݮΒͳ͍͔΋ʁ

Slide 25

Slide 25 text

ݸਓͷϦϑΝΫλϦϯάʹ͸ݶք͕͋Δ Ұਓ͕ςετΛ࡞੒ͯ͠ϦϑΝΫλϦϯάΛߦͳͬͯ΋ɺଞ ͷਓ͕৽ͨʹϨΨγʔίʔυΛ૿΍͢εϐʔυͷํ͕ૣ͍Մ ೳੑ͕͋Γ·͢ɻ ࠷ॳ͸෦԰ͷ૭ׂ͕Ε͍ͯΔ͚͕ͩͩͬͨɺ࣍ୈʹ͍͔ͭ͘ͷ෦԰ͷ૭ׂ͕Ε͍ͯΔঢ়ଶʹͳΔ ׂΕ૭ཧ࿦

Slide 26

Slide 26 text

ςετίʔυΛॻ͘จԽΛ࡞Δ νʔϜͷଟ͘ͷਓ͕ςετίʔυΛॻ͘Α͏ʹͳΕ͹ ɾόά͕গͳ͘ͳΔ ɾϦϑΝΫλϦϯά͠΍͘͢ͳΔ ɾྑ͍ίʔυ͕૿͑Δ ϨΨγʔίʔυͷ૿Ճεϐʔυྑ͍ίʔυͷ૿Ճεϐʔυ ʹͳͬͯγεςϜ͕վળ͞Ε͍͖ͯ·͢

Slide 27

Slide 27 text

Ͳ͏΍ͬͯςετίʔυจԽΛ࡞Δʁ ࢲ͸νʔϜʹςετίʔυΛॻ͘จԽΛ࡞ΔͨΊʹ ҎԼͷΑ͏ͳ͜ͱΛ࣮ࢪ͠·ͨ͠ɻ ɾڧ੍తʹςετίʔυΛҙࣝ͢Δ؀ڥͷ੔උ ɾςετίʔυ͕ޮՌతʹॻ͚͍ͯΔ͔ΛՄࢹԽ ɾςετίʔυ࡞੒Λָʹ͢ΔϥΠϒϥϦͷಋೖ

Slide 28

Slide 28 text

Ͳ͏΍ͬͯςετίʔυจԽΛ࡞Δʁ ࢲ͸νʔϜʹςετίʔυΛॻ͘จԽΛ࡞ΔͨΊʹ ҎԼͷΑ͏ͳ͜ͱΛ࣮ࢪ͠·ͨ͠ɻ ɾڧ੍తʹςετίʔυΛҙࣝ͢Δ؀ڥͷ੔උ ɾςετίʔυ͕ޮՌతʹॻ͚͍ͯΔ͔ΛՄࢹԽ ɾςετίʔυ࡞੒Λָʹ͢ΔϥΠϒϥϦͷಋೖ

Slide 29

Slide 29 text

$*ͷಋೖ σϓϩΠϑϩʔʹ$* ςετ࣮ߦ Λಋೖ͠ɺ ςετʹࣦഊͨ͠ΒΤϥʔʹͯ͠σϓϩΠͤ͞ͳ͍͜ͱͰ ڧ੍తʹςετΛҙࣝ͢Δঢ়ଶΛ࡞Γ·ͨ͠ɻ ίϛοτ Ϗϧυ ςετ σϓϩΠ ಛఆͷϒϥϯνʹϚʔδ͞Εͨࡍʹ ࣗಈͰςετ͢Δ

Slide 30

Slide 30 text

$*ͷಋೖ (SBEMF΍.BWFOͰ$*Λಋೖ͢Δͷʹಛผͳઃఆ͸ඞཁͳ͠ ςετίʔυ͑͋͞Ε͹ɺCVJMEͱಉ࣌ʹςετ΋࣮ߦ͞Ε ·͢ɻ $ ./gradlew --console=plain build > Task :compileJava UP-TO-DATE > Task :processResources UP-TO-DATE > Task :classes UP-TO-DATE > Task :bootJarMainClassName UP-TO-DATE > Task :bootJar UP-TO-DATE > Task :jar UP-TO-DATE > Task :assemble UP-TO-DATE > Task :spotlessInternalRegisterDependencies UP-TO-DATE > Task :spotlessJava UP-TO-DATE > Task :spotlessJavaCheck UP-TO-DATE > Task :spotlessCheck UP-TO-DATE > Task :compileTestJava UP-TO-DATE > Task :processTestResources NO-SOURCE > Task :testClasses UP-TO-DATE > Task :test UP-TO-DATE > Task :check UP-TO-DATE > Task :build UP-TO-DATE BUILD SUCCESSFUL in 1s 10 actionable tasks: 10 up-to-date UFTUλεΫ͕࣮ߦ͞ΕΔ

Slide 31

Slide 31 text

Ͳ͏΍ͬͯςετίʔυจԽΛ࡞Δʁ ࢲ͸νʔϜʹςετίʔυΛॻ͘จԽΛ࡞ΔͨΊʹ ҎԼͷΑ͏ͳ͜ͱΛ࣮ࢪ͠·ͨ͠ɻ ɾڧ੍తʹςετίʔυΛҙࣝ͢Δ؀ڥͷ੔උ ɾςετίʔυ͕ޮՌతʹॻ͚͍ͯΔ͔ΛՄࢹԽ ɾςετίʔυ࡞੒Λָʹ͢ΔϥΠϒϥϦͷಋೖ

Slide 32

Slide 32 text

ΧόϨοδΛՄࢹԽ ΧόϨοδΛՄࢹԽ͢Δ͜ͱͰ ޮՌతʹςετίʔυ͕ॻ͚͍ͯΔ͔͕෼͔Γɺ ·ͨ਺஋ͱͯ݁͠Ռ͕ग़Δ͜ͱͰϞνϕʔγϣϯʹܨ͕Δ͔ ΋ͱߟ͍͑ͯ·͢ɻ ҎԼͰ͸+B$P$PͰग़ྗͨ͠ϨϙʔτΛද͍ࣔͯ͠·͢ɻ

Slide 33

Slide 33 text

+B$P$Pͷಋೖ (SBEMF΍.BWFOʹ͸+B$P$Pͷ1MVHJOΛ௥Ճͯ͋͛͠Ε͹ ར༻ՄೳͰ͢ɻৄࡉ͸ϦϯΫΛ͝ཡ͍ͩ͘͞ɻ plugins { id 'jacoco' } jacocoTestReport { dependsOn test reports { xml.required = false csv.required = false html.required = true } } org.jacoco jacoco-maven-plugin 0.8.9-SNAPSHOT org.jacoco jacoco-maven-plugin report CVJMEHSBEMF QPNYNM IUUQTEPDTHSBEMFPSHDVSSFOUVTFSHVJEFKBDPDP@QMVHJOIUNM IUUQTXXXKBDPDPPSHKBDPDPUSVOLEPDNBWFOIUNM

Slide 34

Slide 34 text

Ͳ͏΍ͬͯςετίʔυจԽΛ࡞Δʁ ࢲ͸νʔϜʹςετίʔυΛॻ͘จԽΛ࡞ΔͨΊʹ ҎԼͷΑ͏ͳ͜ͱΛ࣮ࢪ͠·ͨ͠ɻ ɾڧ੍తʹςετίʔυΛҙࣝ͢Δ؀ڥͷ੔උ ɾςετίʔυ͕ޮՌతʹॻ͚͍ͯΔ͔ΛՄࢹԽ ɾςετίʔυ࡞੒Λָʹ͢ΔϥΠϒϥϦͷಋೖ

Slide 35

Slide 35 text

ςετίʔυಋೖͷ՝୊ ɾॻ͍ͨ͜ͱ͕ͳ͍ਓͷ৺ཧతϋʔυϧ ɾϨΨγʔίʔυʹςετίʔυΛॻ͘ͷ͕େม ςετ͕૝ఆ͞ΕͨίʔυͰ͸ͳ͍ͨΊςετίʔυͷ࡞੒ʹ͕͔͔࣌ؒΔ ։ൃʹ͔͔࣌ؒΔ ΊΜͲͦ͘͞͏

Slide 36

Slide 36 text

ςετίʔυಋೖͷ՝୊ ɾॻ͍ͨ͜ͱ͕ͳ͍ਓͷ৺ཧతϋʔυϧ ɾϨΨγʔίʔυʹςετίʔυΛॻ͘ͷ͕େม ςετ͕૝ఆ͞ΕͨίʔυͰ͸ͳ͍ͨΊςετίʔυͷ࡞੒ʹ͕͔͔࣌ؒΔ ։ൃʹ͔͔࣌ؒΔ ΊΜͲͦ͘͞͏ ָΛ͢ΔͨΊʹϥΠϒϥϦΛಋೖ͠Α͏ʂ ςετϥΠϒϥϦͷಋೖͰ͋Ε͹ɺϓϩμΫγϣϯίʔυ΁ ͷӨڹ΋ݶఆతͰൺֱతؾܰʹಋೖͰ͖·͢

Slide 37

Slide 37 text

ϞοΫΛ࢖͏ %#ૢ࡞ɺෳࡶͳϝιουΛݺͼग़͢ͳͲςετίʔυΛॻ ͘ͷʹۤ࿑͢Δίʔυ΋ϞοΫΛར༻͢Ε͹؆୯ʹςετՄ ೳʹͳΓ·͢ɻ /** * ׂҾֹۚͷܭࢉ * * @param userId * @return ׂҾֹۚ */ public int discount(String userId) { LocalDate toDate = localDateService.now(); LocalDate fromDate = toDate.minusDays(7); List purchases = purchaseRepository.findByPurchaseDateBetween(userId, fromDate, toDate); if (purchases.size() >= 5) { return 200; } if (purchases.size() >= 3) { return 100; } return 0; }

Slide 38

Slide 38 text

ϞοΫΛ࢖͏ ϞοΫΛར༻ͨ͠ςετ͸͜ͷΑ͏ͳܗʹͳΓ·͢ɻ .PDLJUPΛར༻ͨ͠ྫ class DiscountServiceTest { @Mock private LocalDateService localDateService; @Mock private PurchaseRepository purchaseRepository; @InjectMocks private DiscountService discountService; @BeforeEach void beforeEach() { MockitoAnnotations.openMocks(this); } @Test void औҾ݅਺͕5݅ͷ৔߹͸200ԁׂҾ() { String userId = "123"; LocalDate toDate = LocalDate.of(2022, 6, 13); when(localDateService.now()).thenReturn(toDate); LocalDate fromDate = LocalDate.of(2022, 6, 6); List purcases = IntStream.range(1, 6).mapToObj(i -> new Purchase(toDate, 100 * i)).toList(); when(purchaseRepository.findByPurchaseDateBetween(userId, fromDate, toDate)) .thenReturn(purcases); int actual = discountService.discount(userId); assertEquals(200, actual); verify(localDateService).now(); verify(purchaseRepository).findByPurchaseDateBetween(userId, fromDate, toDate); } } ϝιουͷ໭Γ஋ΛϞοΫԽ

Slide 39

Slide 39 text

ΞαʔγϣϯϥΠϒϥϦΛ࢖͏ +6OJUʹσϑΥϧτͰ༻ҙ͞Ε͍ͯΔΞαʔγϣϯͩͱςε τίʔυͷ࡞੒͕ෳࡶʹͳΔ͜ͱ͕͋Γ·͢ɻ List actual = personService.ranking(); List taroFilterdActual = actual.stream() .filter(person -> person.getName().equals("taro") && person.getAge() == 20) .toList(); assertEquals(1, taroFilterdActual.size()); List hanakoFilterdActual = actual.stream() .filter(person -> person.getName().equals("hanako") && person.getAge() == 25) .toList(); assertEquals(1, hanakoFilterdActual.size()); 1FSTPOΫϥε͸ FRVBMTϝιουΛ༻ҙ͍ͯ͠ͳ͍

Slide 40

Slide 40 text

ΞαʔγϣϯϥΠϒϥϦΛ࢖͏ +6OJUʹσϑΥϧτͰ༻ҙ͞Ε͍ͯΔΞαʔγϣϯͩͱςε τίʔυͷ࡞੒͕ෳࡶʹͳΔ͜ͱ͕͋Γ·͢ɻ List actual = personService.ranking(); List taroFilterdActual = actual.stream() .filter(person -> person.getName().equals("taro") && person.getAge() == 20) .toList(); assertEquals(1, taroFilterdActual.size()); List hanakoFilterdActual = actual.stream() .filter(person -> person.getName().equals("hanako") && person.getAge() == 25) .toList(); assertEquals(1, hanakoFilterdActual.size()); List actual = personService.ranking(); Person taro = new Person(0L, "taro", 20); Person hanako = new Person(0L, "hanako", 25); assertThat(actual) .usingRecursiveFieldByFieldElementComparatorOnFields("name", "age") .contains(taro, hanako); ΞαʔγϣϯϥΠϒϥϦΛར༻͢Δ͜ͱͰ؆୯ʹॻ͚ΔՄೳੑ͕͋Γ·͢ɻ ҎԼ͸"TTFSU+Λར༻ͨ͠ྫͰ͢ɻ 1FSTPOΫϥε͸ FRVBMTϝιουΛ༻ҙ͍ͯ͠ͳ͍

Slide 41

Slide 41 text

·ͱΊ w +6OJUΛ࢖͑͹҆શʹϦϑΝΫλϦϯάͰ͖Δ w ݸਓͰͷϦϑΝΫλϦϯάʹ͸ݶք͕͋ΔͨΊςετίʔυΛॻ ͘จԽΛ࡞Δ w $*Λಋೖͯ͠ςετίʔυΛڧ੍తʹҙࣝͤ͞Δ w ΧόϨοδΛՄࢹԽͯ͠ޮՌతʹςετίʔυ͕ॻ͚͍ͯΔ͔ ֬ೝͰ͖Δ؀ڥΛ࡞Δ w ςετίʔυΛָʹ͢ΔϥΠϒϥϦΛಋೖͯ͠ɺςετίʔυ ࡞੒΁ͷϋʔυϧΛԼ͛Δ

Slide 42

Slide 42 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ