atomic figure 1 450 (1)
มีคำถามที่น่าสนใจเกี่ยวกับการ Mock object
ว่าเราควรสร้างขึ้นมาเมื่อไร และทำไมจึงต้องใช้ ?
ดังนั้น จึงลองไปค้นหาดูว่า ในโลกของการพัฒนาว่ามีความคิดเห็นเกี่ยวเรื่องนี้อย่างไร
ซึ่งสามารถสรุปได้คร่าวๆ ดังต่อไปนี้

ความรู้พื้นฐาน

Mock object ส่วนใหญ่จะถูกเรียก เมื่อมีการใช้เครื่องมือช่วยสร้าง
ตัวอย่างในภาษา Java เช่น Mockito, EasyMock, jMock เป็นต้น
เพื่อทำให้สามารถแยกส่วนต่างๆ ของระบบออกมาทดสอบได้ ( isolation )

แต่ในการใช้เครื่องมือต่างๆ มาทำการ Mock object นั้น
ใช้จำนวนทรัพยากรมาก และ จำเป็นต้องศึกษาเพื่อทำความเข้าใจพอสมควร
ดังนั้นก็ลองพิจารณาดูกันเอาเอง ระหว่างใช้เครื่องมือ กับ สร้างขึ้นมาเอง

บางคนอาจจะบอกว่า Mock มันถูกใช้เพื่อบอกบอกขอบเขตของสถาปัตยกรรมของระบบ
เช่น mock ของฐานข้อมูล, web server และระบบอื่นๆ ที่เกี่ยวข้อง
เมื่อเราใช้ Mock object เหล่านี้แล้ว จะได้ประโยชน์ดังนี้

  • ทำการทดสอบเร็วขึ้น
  • ทำให้การทดสอบไม่อ่อนไหวต่อความผิดพลาด ที่อาจเกิดขึ้นจากการ configuration ของ object ที่ถูก Mock ขึ้นมา
  • ทำให้ง่ายต่อการทดสอบในทุกๆ กรณี เช่น กรณีที่ก่อให้เกิดความผิดพลาดทั้งหมด
  • ทำให้สามารถทดสอบในส่วนต่างๆ ที่เกี่ยวข้อง ตั้งแต่ต้นจนจบได้
  • ในการสร้าง Mock object นั้น จะไม่ส่งค่าของ Mock object อื่นๆ กลับมาโดยเด็ดขาด

และประโยชน์ที่สำคัญมากๆ จากแนวคิดนี้ คือ
มันจะบังคับให้คุณคิดว่า ขอบเขตของสถาปัตยกรรมของระบบคุณอยู่ตรงไหน
เมื่อมองเห็นขอบเขตการทำงานที่ชัดเจนแล้ว
จะทำให้คุณสร้าง interface ของส่วนการทำงานนั้นๆ ขึ้นมา อย่างอัตโนมัติ
ส่งผลให้การจัดการระบบทำได้ง่าย คือ ง่ายต่อการพัฒนา และ ติดตั้งระบบงาน
เนื่องจากแต่ละส่วนไม่ผูกมัดกัน

ถ้าในแง่การออกแบบและพัฒนาระบบจะเรียกว่า Separation of Concern
เป็นคุณสมบัติหลักของการออกแบบ software ที่ดี
เป็นแนวคิดที่มีมาก่อน Test Driven Development อีกด้วย
นั่นแปลว่า ถ้าคุณออกแบบได้ดี หมายถึง การทดสอบที่ง่ายและดีนั่นเอง

เมื่อไรเราควรใช้ Mock object ?

ประกอบไปด้วยเหตุผลต่างๆ เหล่านี้

  • เมื่อ real object นั่นมีพฤติกรรมที่ยากต่อการคาดเดา
  • เมื่อ real object มันสร้างยาก หรือ กำหนดค่าขึ้นมาได้ยาก
  • เมื่อ real object ทำงานช้า
  • เมื่อ real object คือ User interface ของระบบ
  • เมื่อ real object ใช้งาน callback
  • เมื่อ real object ไม่มีส่วนการทำงานจริงๆ อยู่

จะเห็นได้ว่ามีหลายเหตุผลนะครับ ไม่ใช่แค่จะ Mock object มาเพียงเพราะว่า
object นั้นมันยากต่อการเขียน unit test เท่านั้น

ข้อสรุปของ Mock object

พยายามใช้ Mock object ให้น้อยที่สุด หรือเท่าที่จำเป็นเท่านั้น
โดยเริ่มจากการหาวิธีการที่คุณจะทดสอบก่อน
ทำการออกแบบสิ่งที่คุณต้องการทดสอบ
ซึ่งอาจจะไม่ต้องการการ Mock เลย

การใช้ Mock object เพื่อแบ่งขอบเขตการทำงานของส่วนต่างๆ ทั้งในและนอกระบบ
และเราใช้เพื่อจัดการส่วนการทำงานของระบบ

ให้จำไว้ว่าการ Mock object ไม่ใช่เพื่อสำหรับการทดสอบ แต่เพื่อสำหรับทุกๆ สิ่งในระบบนะ

ท้ายสุดและสุดท้ายจริงๆ

อย่าลืมว่า การทดสอบที่ดีนั้น มีคุณสมบัติดังนี้

  • ทำงานได้อย่างรวดเร็ว
  • เมื่อทำการเปลี่ยนแปลง production code แล้ว จะต้องกระทบกับ test code น้อย
  • มีระดับ coverage ที่สูง

แล้วมันจะส่งผลให้ระบบที่คุณออกแบบและพัฒนา ดีขึ้นกว่าเดิมอย่างแน่นอน

Reference Websites
When to mock 
When to mock and Integrate
Mock are not stub
Mock Object
When to mock object