ฉันเพิ่งอ่านข้อความที่ตัดตอนมาจากหนังสือ "Growing Object-Oriented Software" ซึ่งอธิบายเหตุผลบางอย่างว่าทำไมไม่แนะนำให้ใช้การล้อเลียนระดับคอนกรีต
นี่คือตัวอย่างโค้ดของการทดสอบหน่วยสำหรับคลาส MusicCentre:
public class MusicCentreTest {
@Test public void startsCdPlayerAtTimeRequested() {
final MutableTime scheduledTime = new MutableTime();
CdPlayer player = new CdPlayer() {
@Override
public void scheduleToStartAt(Time startTime) {
scheduledTime.set(startTime);
}
}
MusicCentre centre = new MusicCentre(player);
centre.startMediaAt(LATER);
assertEquals(LATER, scheduledTime.get());
}
}
และคำอธิบายแรกของเขา:
ปัญหาด้วยวิธีนี้คือมันทิ้งความสัมพันธ์ระหว่างวัตถุโดยนัย ฉันหวังว่าเราได้ทำให้ชัดเจนแล้วในตอนนี้ความตั้งใจของการพัฒนาขับเคลื่อนทดสอบกับวัตถุจำลองคือการค้นพบความสัมพันธ์ระหว่างวัตถุ ถ้าฉันคลาสย่อยไม่มีอะไรในรหัสโดเมนที่จะทำให้ความสัมพันธ์ดังกล่าวปรากฏขึ้นเพียงแค่วิธีการบนวัตถุ ทำให้ยากที่จะดูว่าบริการที่สนับสนุนความสัมพันธ์นี้อาจเกี่ยวข้องกับที่อื่นหรือไม่และฉันจะต้องทำการวิเคราะห์อีกครั้งในครั้งต่อไปที่ฉันทำงานกับชั้นเรียน
ฉันไม่สามารถเข้าใจสิ่งที่เขาหมายถึงเมื่อเขาพูดว่า:
ทำให้ยากที่จะดูว่าบริการที่สนับสนุนความสัมพันธ์นี้อาจเกี่ยวข้องกับที่อื่นหรือไม่และฉันจะต้องทำการวิเคราะห์อีกครั้งในครั้งต่อไปที่ฉันทำงานกับชั้นเรียน
ผมเข้าใจว่าสอดคล้องกับการบริการให้กับMusicCentre
วิธีการ startMediaAt
'เรียกว่า
เขาหมายถึงอะไร "ที่อื่น"?
ข้อความที่ตัดตอนมาที่สมบูรณ์อยู่ที่นี่: http://www.mockobjects.com/2007/04/test-smell-mocking-concrete-classes.html