ฉันกำลังทำงานในโครงการที่การโทรภายในคลาสเป็นปกติ แต่ผลลัพธ์จะมีค่าง่าย ๆ หลายครั้ง ตัวอย่าง ( ไม่ใช่รหัสจริง ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
การเขียนการทดสอบหน่วยสำหรับรหัสประเภทนี้นั้นยากมากเพราะฉันแค่ต้องการทดสอบระบบเงื่อนไขและไม่ได้ใช้สภาพจริง (ฉันทำอย่างนั้นในการทดสอบแยก) ในความเป็นจริงมันจะดีกว่าถ้าฉันผ่านฟังก์ชั่นที่ใช้เงื่อนไขและในการทดสอบฉันเพียงแค่ให้ล้อเลียน ปัญหาด้วยวิธีนี้คือความฮือฮาไปนี้เราจะใช้ยาชื่อสามัญมาก
วิธีการทำงาน; อย่างไรก็ตามคือการทำให้วัตถุที่ทดสอบเป็นสายลับและเยาะเย้ยการเรียกไปยังฟังก์ชันภายใน
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
ข้อกังวลที่นี่คือการใช้งาน SUT นั้นมีการเปลี่ยนแปลงอย่างมีประสิทธิภาพและอาจเป็นปัญหาในการทดสอบให้สอดคล้องกับการใช้งาน มันเป็นเรื่องจริงเหรอ? มีวิธีปฏิบัติที่ดีที่สุดในการหลีกเลี่ยงความหายนะของการเรียกใช้เมธอดภายในหรือไม่?
โปรดทราบว่าเรากำลังพูดถึงบางส่วนของอัลกอริทึมดังนั้นการแบ่งออกเป็นหลายคลาสอาจไม่ใช่การตัดสินใจที่ต้องการ