สำหรับการทดสอบอย่างง่ายการเยาะเย้ยเลเยอร์การเข้าถึงฐานข้อมูลเป็นที่ยอมรับ คุณเรียกgetName()
มันเรียกว่า DAO ที่ถูกล้อเลียนและส่งคืน "John" สำหรับชื่อและ "Smith" สำหรับนามสกุลรวบรวมพวกเขาและทุกอย่างสมบูรณ์แบบ ไม่จำเป็นต้องทดสอบหน่วยในฐานข้อมูลจริง
สิ่งต่าง ๆ จะยิ่งมากขึ้นเมื่อตรรกะมีความซับซ้อนมากขึ้น ถ้าคุณมีวิธี "createOrUpdateUser (... )" หากคุณจำลองฐานข้อมูลคุณสามารถตรวจสอบว่าวิธีการที่กำหนดได้รับการเรียกใช้ครั้งเดียวด้วยพารามิเตอร์ที่แน่นอนเมื่อจำลองไม่ส่งคืนวัตถุและวิธีการที่แตกต่างกันจะถูกเรียกใช้ในฐานข้อมูลเมื่อมันกลับวัตถุที่มีอยู่ สิ่งนี้เริ่มต้นขึ้นที่บรรทัดเลือนที่มันอาจจะง่ายกว่า (โดยเฉพาะถ้ามีอยู่แล้ว) เพื่อหมุนผู้เชี่ยวชาญในฐานข้อมูลหน่วยความจำและทดสอบรหัสนั้นด้วยข้อมูลที่กำหนดค่าไว้ล่วงหน้า
ในรหัสจริงที่ฉันทำงาน (จุดขาย) เรามีresumeSuspededTransaction(...)
วิธี สิ่งนี้จะดึงธุรกรรมจากฐานข้อมูลไปยังวัตถุ (และส่วนประกอบ) และอัพเดตฐานข้อมูล เรามีการเยาะเย้ยและข้อผิดพลาดที่แฝงตัวอยู่ในรหัสบางแห่งด้วยการทำให้เป็นอนุกรมและการดีซีเรียลไลซ์เซชั่นของข้อมูลที่จะไปยังฐานข้อมูล (เราเปลี่ยนประเภทที่ถูกทำให้เป็นอนุกรม
The mock ไม่ได้แสดงให้เราเห็นข้อผิดพลาดเพราะมันกลับมาเส้นทางแห่งความสุข - ทำธุรกรรมเป็นลำดับจัดเก็บใน mock, deserialize จาก mock, ทดสอบว่าพวกเขาเท่ากัน อย่างไรก็ตามเมื่อคุณซีเรียลไลซ์วัตถุที่มีศูนย์นำหน้าไปยังฐานข้อมูลวัตถุนั้นจะถูกดรอปและจากนั้นทำการรวมกลับเข้าไปในสตริงโดยไม่ต้องมีศูนย์ เราตรวจพบข้อผิดพลาดที่ไม่มีฐานข้อมูลผ่านการแก้ไขปัญหา (มันไม่ยากที่จะสังเกตเห็นเมื่อเรารู้ว่ามันอยู่ที่นั่น)
ต่อมาเราใส่ฐานข้อมูลลงในนั้นและตระหนักว่าข้อผิดพลาดจะไม่ผ่านการทดสอบ Junit นั้นถ้าเราไปที่ฐานข้อมูลหน่วยความจำแทน
ในฐานข้อมูลหน่วยความจำมีข้อดี:
- สามารถหมุนได้อย่างรวดเร็ว (ไม่จำเป็นต้องมี DBA เพื่อตั้งค่าบัญชีตารางและอื่น ๆ ) สำหรับการทดสอบ
- ข้อมูลสามารถกำหนดค่าล่วงหน้าสำหรับการทดสอบนั้น
- การทดสอบไม่จำเป็นต้องกังวลเกี่ยวกับการย้อนกลับการทดสอบเมื่อเสร็จสิ้น
- การทดสอบแต่ละครั้งมีฐานข้อมูลหน่วยความจำของตัวเองดังนั้นคุณไม่ต้องกังวลหากการทดสอบสองรายการทำงานพร้อมกัน
- สามารถรันบนระบบที่ไม่มีการเชื่อมต่อกับฐานข้อมูลจริง