ในขณะที่การทดสอบหน่วยคุณไม่ได้คาดหวังว่าจะทดสอบกับฐานข้อมูลหรืออย่างน้อยก็ไม่ใช่ฐานข้อมูลที่คุณไม่ได้เตรียมไว้สำหรับการทดสอบหน่วย การทดสอบกับฐานข้อมูลและโดยทั่วไปการทดสอบเลเยอร์ต่าง ๆ ของแอปพลิเคชันของคุณในเวลาเดียวกันจะถูกมองว่าเป็นการทดสอบการรวมเข้าด้วยกัน ด้วยการทดสอบหน่วยคุณควรทดสอบเฉพาะวิธีที่คุณทำสิ่งที่มันส่งกลับขึ้นอยู่กับพารามิเตอร์ที่แตกต่างกันและเมื่อ (หรือไม่) ควรล้มเหลว
เป็นที่คาดหวังอย่างมากว่าในวิธีการของคุณคุณโทรไปยังวิธีการXจากชั้นเรียนอื่น ๆ คุณไม่ได้ทดสอบวิธีการXเหล่านี้ดังนั้นสิ่งที่คุณต้องทำคือการจำลองวิธีการเหล่านี้
ฉันคิดว่าคุณกำลังเขียนโค้ดของคุณใน Java ในกรณีนี้คุณมีกรอบการเยาะเย้ยที่ยอดเยี่ยมเช่นMockitoซึ่งอาจเป็นประโยชน์กับคุณ ไม่ว่าคุณจะใช้กรอบการเยาะเย้ยหรือไม่ก็เป็นทางเลือกของคุณฉันจะบอกว่าพวกเขาจะประหยัดเวลาได้มากและอย่างที่ฉันพูดถึงอย่างน้อยก็ไม่ซับซ้อน
หากคุณเพียงต้องการที่จะเขียนจำลองของคุณเองเพื่อทดลองสมมติว่าคุณมีCustomerRepository
คลาสต่อไปนี้:
public class CustomerRepository {
public CustomerDTO getCustomer(int id) {
...
}
}
คุณสามารถเขียนCustomerRepository
คลาสที่เยาะเย้ยและสกปรกได้ด้วยวิธีต่อไปนี้:
public class MockedCustomerRepository extends CustomerRepository {
public boolean bThrowDatabaseException;
public boolean bReturnNull;
public boolean bReturnCustomerWrongId;
public boolean bReturnCustomerWithId;
public CustomerDTO getCustomer(int id) {
if(bThrowDatabaseException) {
throw new DatabaseException("xxx");
} else if(bReturnNull) {
return null;
} else if(bReturnCustomerWrongId) {
throw new CustomerNotExistException(id);
} else if(bReturnCustomerWithId) {
return new CustomerDTO(id);
}
}
}
จากนั้นในกรณีทดสอบของคุณคุณจะแทนที่อินสแตนซ์ "มาตรฐาน" ของคุณCustomerRepository
ด้วยอินสแตนซ์ที่เยาะเย้ยซึ่งจะช่วยให้คุณทดสอบวิธีการของคุณสำหรับผลลัพธ์ต่างๆของgetCustomer
:
public class CustomerRestTest {
public void testGetCustomer_databaseFailure() {
MockedCustomerRepository dto = new MockedCustomerRepository();
dto.bThrowDataBaseException = true;
yRestClass rest = new MyRestClass();
rest.dto = dto;
rest.getCustomer(0);
// depending on what you do in your getCustomer method, you should check if you catched the exception, or let it pass, etc.. Make your assertions here
public void testGetCustomer_customerNotExist() {
// etc.
}
}
โดยทั่วไปวิธีการทดสอบทุกวิธีควรทดสอบอย่างเดียวเท่านั้นสิ่งนี้จะช่วยให้การทดสอบของคุณมีขนาดเล็กและมุ่งเน้นไปที่งานเดียว
ฉันจะทำซ้ำ :-) การเขียนคลาสที่เยาะเย้ยทั้งหมดต้องใช้เวลาพอสมควรตามที่คุณเห็น ลองพิจารณาใช้กรอบการทำงานที่เยาะเย้ยยิ่งเขียนรหัสน้อยลงมีข้อผิดพลาดน้อยลงใช่ไหม การเยาะเย้ยวิธีการที่ทำให้เกิดข้อยกเว้นหรือส่งกลับค่าที่กำหนดสำหรับพารามิเตอร์ที่กำหนดคือชิ้นส่วนของเค้กและใช้เวลา 2 หรือ 3 บรรทัด (ด้วย mockito อย่างน้อย)
หวังว่าจะช่วยทดสอบวิธี REST ของคุณ