π Chapter 24: ν μ€νΈ μ μ°μ±
- ν
μ€νΈ λΆμμ μ±μ 곡ν΅μ μΈ μμΈμ λ€μκ³Ό κ°λ€.
- ν μ€νΈκ° μμ€ν μμ κ΄λ ¨μ΄ μλ λΆλΆμ΄λ ν μ€νΈ λμ κ°μ²΄μ 무κ΄ν νμμ λ무 κΈ΄λ°νκ² κ²°ν λΌ μλ€.
- ν μ€νΈκ° λμ μ½λμ μμ νμλ₯Ό κ³Όλνκ² κΈ°μ ν΄μ νμ μ΄μμΌλ‘ μ μ½νλ€.
- μ¬λ¬ ν μ€νΈμμ λμΌν μ ν μ½λμ νμλ₯Ό μνν λ μ€λ³΅μ΄ μκΈ΄λ€.
- ν μ€νΈ λΆμμ μ±μ μμ€ν μ€κ³μλ κ΄λ ¨μ΄ μλλ° μ΄λ€ κ°μ²΄κ° μμ‘΄μ±μ΄ λ무 λ§κ±°λ ν΄λΉ κ°μ²΄μ μμ‘΄μ±μ΄ κ°μΆ°μ Έ μμ΄ νκ²½κ³Ό λΆλ¦¬νκΈ°κ° μ΄λ ΅λ€λ©΄ ν΄λΉ κ°μ²΄μ ν μ€νΈλ κ°μ²΄μ λλ¨μ΄μ§ λΆλΆμ΄ λ³κ²½λ λ μ€ν¨ν κ²μ΄λ€.
- ν μ€νΈ κ°λ μ±κ³Ό ν볡λ ₯μ λ μ μλ κ΄κ³λ©°, λ¬Έμ μ μ§μ€νκ³ , λͺ λ£ν μ€λΉ μ¬νμ κ°μΆκ³ μμΌλ©°, μ€λ³΅μ΄ μ΅μνλ ν μ€νΈλ μ΄λ¦μ μ§κΈ°κ° μ½κ³ ν μ€νΈ λͺ©μ μ΄ λΆλͺ νκ² λλ¬λλ€.
π ννμ΄ μλ μ 보λ₯Ό μν ν μ€νΈβ
- ν μ€νΈκ° μμ€ν μ λ€λ₯Έ λΆλΆμμ ννλλ κ°μ μν₯μ λ°λ κ΅¬μ‘°κ° λλ©΄ κ·Έλ¬ν λΆλΆμ λν μμ‘΄μ±μ΄ μκΈ°κ³ , κ²°κ΅ μμ‘΄νλ λΆλΆμ΄ λ³κ²½λλ©΄ ν μ€νΈλ κΊ μ§ κ²μ΄λ€.
- μλλ νΉμ μ΄λ©μΌ μ£Όμμ ν΄λΉνλ Customer λ₯Ό μ°Ύλ κ²μ΄λ€.
public interface CustomerBase {
// κ³ κ°μ μ°Ύμ μ μλ€λ©΄ nullμ λ°ν
Customer findCustomerWithEmailAddress(String emailAddress);
// ...
}
// ν
μ€νΈ
allowing(CustomerBase).findCustomerWithEmailAddress(theAddress);
wil(returnValue(null)); // λ λ°ν
- μ¬κΈ°μ
null
μ μ¬μ©νλλ° λ¬Έμ μ μnull
μ΄ λ¬΄μμ μλ―Ένκ³ μΈμ μ μ νμ§ κΈ°μ΅ν΄μΌ νλ€λ κ²μ΄λ€. μ¦, ν μ€νΈκ° μκΈ° μμ μ μ΄μ§ μλ€. λ λ€λ₯Έ μ μ μ μ§ λ³΄μ€μ λλ λΉμ©μ΄λ€. μΈμ κ°null
μ°Έμ‘°κ° λ°μνλ κ³³μCustomerBase
κΉμ§ μ°Ύμ λ΄λ €κ°μΌ ν κ²μ΄λ€. - λμ ν
μ€νΈμ 'κ³ κ°μ μ°Ύμ μ μμ'μ μ체μ μΈ ννμ
null
리ν°λ΄ λμ μ μ ν μ΄λ¦μ μ§λ λ¨ ν κ°μ§ μ μ½μΌλ‘ λΆμ¬νλ€λ©΄ μ΄λ¬ν νλ€κ³ λ¨μ‘°λ‘μ΄ μΌμ νΌν μ μμ κ²μ΄λ€.
public static final Maybe<Customer> NO_CUSTOMER_FOUND = Maybe.nothing();
- ν μ€νΈλ κ°μ²΄ κ°μ μ λ¬λ μ 보 μΈ‘λ©΄μμ μμ±ν΄μΌ νλ©°, ν΄λΉ μ λ³΄κ° μ΄λ»κ² ννλλμ§ μΈ‘λ©΄μμ μμ±ν΄μλ μ λλ€.
NO_CUSTOMER_FOUND
κ°μ μ€μν κ°μ μμλ‘ ν κ³³μμ μ μν΄μΌ νλ€.
π μ νν λ¨μ β
- ν μ€νΈμμλ ν μ€νΈ μ€μΈ μλ리μ€μ κ΄λ ¨μ΄ μλ λ¨μ μ μ§μ€νλ€. ν μ€νΈ μ λ ₯ κ°μ μ’μ°λλ λ¨μ κ°μ μμ νκ³ λ€λ₯Έ ν μ€νΈμμ κ²μ¬ν νμλ₯Ό μ¬λ¨μ νλ κ²λ μμ νλ€.
- ν μ€νΈ λ¨μ μ λλΆλΆ λμΌμ±μ λ¨μν νμΈνλ κ²μ ν΄λΉνλ€.
- κ²°κ³Όκ° λ 볡μ‘ν΄μ§ μ μλ λ°©λ²
- κ²°κ³Όλ ꡬ쑰μ μΈ κ° νμ μΌλ‘ μ μλ μ μλ€. μ΄λ μ°λ¦¬κ° λ¨μ νκ³ μ νλ μμ±μ μ§μ μ°Έμ‘°ν μ μκΈ° λλ¬Έμ μ΄ν΄νκΈ° μ΄λ ΅μ§ μλ€.
- ν μ€νΈ λ¬Έμμ΄μ κ΄ν΄ λ¨μ ν΄μΌ ν λκ° μλ€. λλλ‘ ν μ€νΈκ° μ νν 무μμ΄μ΄μΌ ν μ§ μκ³ μΆμλ°, νΉμ λ©μμ§λ₯Ό μ°ΎμμΌ ν λκ° κ·Έλ λ€. μ΄λ λ¨μ§ ν΅μ¬ μ λ³΄κ° ν¬ν¨λΌ μλμ§λ§ μκ³ μΆλ€λ©΄ λ€μκ³Ό κ°μ΄ μμ±νλ©΄ λλ€.
assertThat(failureMessage, allOf(containsString("strikePrice=92"), containsString("id=FGD.430")));
- μ΄ λͺ¨λ λ¬Έμμ΄μ΄
failureMessage
μ μ»γ΄κ°μ λνλλμ§λ§ λ¨μ νλ€. μ΄λ κ²λ§ ν΄λ νμ ν μ μμΌλ©°, μ€μνλ€κ³ μ¬κ²¨μ§λ€λ©΄ λ€λ₯Έ ν μ€νΈλ₯Ό μμ±ν΄ λ©μμ§κ° μ¬λ°λ₯Έ ν¬λ§·μΌλ‘ λΌ μλμ§ νμΈν μ μλ€.
π μ νν μμ ꡬ문β
- κ° λͺ© κ°μ²΄ ν μ€νΈμμλ ν μ€νΈ λμ κ°μ²΄μ κ·Έλ¬ν κ°μ²΄μ μ΄μ κ°μ μνΈ μμ©μ κ΄λ ¨ μΈλΆ μ¬νμ λͺ μν΄μΌ νλ€. ν κ°μ²΄μ λν μΌλ ¨μ λ¨μ ν μ€νΈλ ν΄λΉ κ°μ²΄κ° μμ€ν μ λ€λ₯Έ λΆλΆκ³Ό ν΅μ νλ λ° νμν νλ‘ν μ½μ κΈ°μ νλ€.
π μ νν 맀κ°λ³μ 맀μΉβ
- λ©μλμ μ λ¬νλ κ°μ κ΄ν΄μλ μ νν¨μ κΈ°νκ³ μ νλ€.
π νμ©κ³Ό μμβ
- jMockμ λͺ¨λ μμ κ΅¬λ¬Έμ΄ ν μ€νΈ λμ€μ μΆ©μ‘±λμ§λ§ νμ©μ μΌμΉνκ±°λ κ·Έλ μ§ μμ μλ μλ€. μ΄λ¬ν ꡬλΆμ μμ μ νΉμ ν μ€νΈμμ μ€μν λΆλΆμ κ°μ‘°νλ λ° μλ€.
- μμ ꡬ문μ ν μ€νΈνλ νλ‘ν μ½μ ν΅μ¬μ μΈ μνΈ μμ©μ μμ νλ€. (μ΄ λ©μμ§λ₯Ό κ°μ²΄μ 보λ΄λ©΄ ν΄λΉ κ°μ²΄κ° μ΄ λ€λ₯Έ λ©μμ§λ₯Ό μ΄ μ΄μ κ°μ²΄μ λ³΄λΌ κ²μΌλ‘ μμνλ€.)
- νμ©μ ν μ€νΈνλ μνΈ μμ©μ 보쑰νλ€. ν μ€νΈ νκ³ μΆμ νμμ λν΄ κ°μ²΄κ° μ¬λ°λ₯Έ μνλ₯Ό μ§λκ² νκΈ° μν΄ νμ©μ μ€ν μΌλ‘ μ¬μ©νκΈ°λ νλ€. μ΄λ¬ν λ©μμ§λ λ€λ₯Έ ν μ€νΈμμ λ€λ£° κ²μ΄λ€.
- μ΄ κ·μΉμ ν μ€νΈλ κ°μ²΄μμ ν μ€νΈλ₯Ό λΆλ¦¬νλ λ° λμμ΄ λλ€.
π 무κ΄ν κ°μ²΄ 무μνκΈ°β
- μν μ€μΈ κΈ°λ₯κ³Ό 무κ΄ν νλ ₯ κ°μ²΄λ₯Ό 무μν΄ ν μ€νΈλ₯Ό λ¨μνν μ μλ€.
- μ΄λ κ² νλ©΄ ν μ€νΈκ° λ¨μν΄μ§κ³ λ¬Έμ μ μ§μ€ν μ μμΌλ―λ‘ μ€μν λ°κ° 무μμ΄κ³ μ½λμ ν μΈ‘λ©΄μ μκΈ΄ λ³νκ° κ΄λ ¨μ΄ μλ ν μ€νΈλ₯Ό κΉ¨λ¨λ¦¬μ§λ μλμ§ μ¦μ μ μ μλ€.
- νμ§λ§ 무μλ κΈ°λ₯λ μ΄λκ°μμ ν μ€νΈν΄μΌ νκ³ λͺ¨λ κ²μ ν¨κ» λμκ°κ² νλ κ³ μμ€ ν μ€νΈκ° μμμ 보μ₯ν΄μΌ νλ€.
π νΈμΆ μμβ
- jMockμμλ μ΄λ€ μμλ‘λ λͺ© κ°μ²΄λ₯Ό νΈμΆν μ μλ€. μ¦, μμ ꡬ문μ κ°μ μμλ‘ μ μΈν νμκ° μλ€.
- ν μ€νΈμμ μνΈ μμ© μμμ κ΄ν΄ λ§νλ λ°κ° μ μμλ‘ κ΅¬νμλ μ μ°μ μ΄ λ λμ΄λλ€. μμΈλ¬ ν μ€νΈλ₯Ό μ΄λ»κ² ꡬ쑰ννλλμλ μ μ°μ±μ΄ μκΈ΄λ€.
- jMockμλ νΈμΆ μμλ₯Ό μ μ½νλ λ κ°μ§ λ©μ»€λμ¦μ΄ μλλ° νλλ μνΈμ€λ‘ νΈμΆνλ μμ°¨ λͺ©λ‘μ μ μνλ κ²μ΄κ³ λ€λ₯Έ νλλ μν κΈ°κ³λ‘ μ’ λ μ κ΅ν μμ μ μ½μ μμ ν μ μλ€.
- μνΈμ€λ μν κΈ°κ³μ λΉν΄ μ΄ν΄νκΈ°κ° λ κ°λ¨νμ§λ§ μ μ½μ± νμ λΆμ μ νκ² μ¬μ©ν κ²½μ° ν μ€νΈκ° λΆμμ ν΄μ§ μ μλ€. μνΈμ€λ μ΄λ€ κ°μ²΄κ° μ΄μ κ°μ²΄μ μ¬λ°λ₯Έ μμλ‘ ν΅μ§λ₯Ό 보λλμ§ νμΈνλ κ°μ₯ μ μ©ν μλ¨μ΄λ€.
π jMock μνμ μλ ₯β
- Statesλ₯Ό μ΄μ©ν΄ ν μ€νΈμ μΈ κ°μ§ μ°Έκ°μ μ ν, μ¦ ν μ€νΈ λμ κ°μ²΄, ν΄λΉ κ°μ²΄μ μ΄μ, κ·Έλ¦¬κ³ ν μ€νΈ μ체λ₯Ό λͺ¨λΈλ§ν μ μλ€.
- ν μ€νΈ λμ κ°μ²΄μ μνμ λν΄ μ΄ν΄ν λ°λ₯Ό ννν μ μλ€. ν μ€νΈλ ν΄λΉ κ°μ²΄κ° μ΄μ κ°μ²΄μ μ λ¬νλ μ΄λ²€νΈλ₯Ό λκΈ°νκ³ μλ€κ° μ΄λ²€νΈλ₯Ό μ΄μ©ν΄ μν μ μ΄λ₯Ό μΌμΌν€κ³ κ°μ²΄μ νλ‘ν μ½μ μλ°νλ μ΄λ²€νΈλ₯Ό κ±°λΆνλ€.
- Statesλ ν μ€νΈμμ ν΄λΉ κ°μ²΄ κ΄ν΄ μ°Ύμ κ΄λ ¨ μ¬νμ κΈ°μ νμ§, κ°μ²΄ λ΄λΆ ꡬ쑰λ₯Ό κΈ°μ νμ§ μνλ€. (κ°μ²΄μ ꡬνμ μ μ½ λ°μ§ μλλ€.)
π ν¨μ¬ λ μμ λ‘μ΄ μμ ꡬ문β
- jMockμλ μμ μμ ꡬ문μ μ μν΄ λΌμ λ£μ μ μλ μ§μ μ΄ μλ€. μ΄λ₯Όν λ©΄, μ΄λ€ μ κ·Όμ λ©μλλ₯Ό λ°μλ€μ΄κ²λ μμ ꡬ문μ μμ±ν μ μλ€.
allowing(aPeerObject).method(startsWith("get")).withNoArguments();
- λν, κ°μ²΄ μ§ν© μ€ νλμ λν νΈμΆμ λ°μλ€μ΄κ²λ μμ ꡬ문μ μμ±ν μ μλ€.
oneOf(anyOf(same(o1), same(o2), same(o3))).method("doSomething");
π μ€νμ© μ₯ κ°μ²΄β
- μ΄λν° μ½λμ λν ν μ€νΈλ₯Ό μμ±ν λ κ°μ₯ μ¬μ΄ μ κ·Όλ²μ μ ν리μΌμ΄μ λλ©μΈ λͺ¨λΈμ νμ μ μ¬μ©νλ κ²μ΄λ€.
- νμ§λ§, μ΄λ κ² νλ©΄ μ ν리μΌμ΄μ κ³Ό μ΄λν° λλ©μΈμ΄ κ±Έν©λκΈ° λλ¬Έμ ν μ€νΈκ° λΆμμ ν΄μ§λ€. μ΄ κ²½μ° κ΄μ¬μ¬λ₯Ό λΆλ¦¬νμ§ μμμΌλ― λ‘ μ ν리μΌμ΄μ λͺ¨λΈμ λ³κ²½νμ λ ν μ€νΈλ₯Ό μλͺ» κΉ¨λ¨λ¦¬λ μνμ΄ μ΄λλλ€.
- λ λ€λ₯Έ λ¬Έμ λ ν μ€νΈ κ°μ μ΄ κΉ¨μ§ λ μ΄λ₯Ό νμ νκΈ°κ° λ μ΄λ ΅λ€λ κ²μ΄λ€. ν μ€νΈ μ€μμ μλμ΄ λ©μΆ κ²μ΄ μλ€λ κ²κ³Ό μ€μν κΈ°λ₯μ΄ λ€λ€μ§μ§ μμλ€λ μ¬μ€μ μ°λ¦¬μκ² μλ €μ£Όλ κ²μ΄ μ무κ²λ μλ€.