ฉันได้เขียนการทดสอบหน่วยสำหรับวิธีการคงที่ วิธีการคงที่ใช้เวลาเพียงหนึ่งข้อโต้แย้ง ประเภทของการโต้แย้งเป็นชั้นสุดท้าย ในแง่ของรหัส:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
ดังนั้นสำหรับUtility
ชั้นเรียนฉันได้สร้างชั้นทดสอบUtilityTests
ซึ่งฉันได้เขียนข้อสอบสำหรับวิธีนี้, getName
. กรอบการทดสอบหน่วยเป็นTestNGMockito
และห้องสมุดเยาะเย้ยที่ใช้คือ ดังนั้นการทดสอบทั่วไปมีโครงสร้างดังต่อไปนี้:
public class UtilityTests {
@Test
public void getNameTest() {
// Arrange
Customer customerMock = Mockito.mock(Customer.class);
Mockito.when(...).thenReturn(...);
// Act
Optional<String> name = Utility.getName(customerMock);
// Assert
Assert.assertTrue(...);
}
}
อะไรคือปัญหา ?
ในขณะที่การทดสอบทำงานได้สำเร็จในเครื่องภายใน IntelliJ พวกเขาล้มเหลวในเจนกินส์ (เมื่อฉันกดรหัสของฉันในสาขาระยะไกลบิลด์จะถูกทริกเกอร์และการทดสอบหน่วยจะทำงานในตอนท้าย) ข้อความแสดงข้อผิดพลาดคือ sth ดังนี้:
org.mockito.exceptions.base.MockitoException: ไม่สามารถเยาะเย้ย / คลาสสอดแนม com.packagename.Customer Mockito ไม่สามารถเยาะเย้ย / สายลับเพราะ: - คลาสสุดท้าย
ฉันพยายามทำอะไร
ฉันค้นหาเล็กน้อยเพื่อหาทางออก แต่ฉันไม่ได้ทำมัน ฉันทราบที่นี่ว่าฉันไม่ได้รับอนุญาตให้เปลี่ยนความจริงที่ว่าCustomer
เป็นชั้นสุดท้าย นอกจากนี้ฉันต้องการถ้าเป็นไปได้ที่จะไม่เปลี่ยนแปลงการออกแบบเลย (เช่นการสร้างอินเทอร์เฟซที่จะเก็บวิธีการที่ฉันต้องการเยาะเย้ยและระบุว่าระดับลูกค้าใช้อินเทอร์เฟซนั้นเป็นอย่างถูกต้อง แสดงความคิดเห็น) สิ่งที่ฉันพยายามเป็นตัวเลือกที่สองกล่าวถึงMockito สุดท้าย แม้จะมีข้อเท็จจริงที่ว่าสิ่งนี้แก้ไขปัญหาได้ แต่มันก็ทำการทดสอบหน่วยอื่น ๆ :( ซึ่งไม่สามารถแก้ไขได้ด้วยวิธีที่ชัดเจน
คำถาม
ดังนั้นนี่คือคำถามสองข้อที่ฉันมี:
- เป็นไปได้อย่างไรในตอนแรก? การทดสอบไม่ควรล้มเหลวทั้งในประเทศและในเจนกินส์หรือ
- วิธีนี้สามารถแก้ไขได้ตามข้อ จำกัด ที่ฉันกล่าวถึงข้างต้น
ขอบคุณล่วงหน้าสำหรับความช่วยเหลือใด ๆ
Customer
มีเหตุผลใด ๆ ในเรื่องนี้หรือมันเป็นเพียงข้อมูลชั้นใบ้? หากเป็นเพียงกลุ่มของทุ่งหญ้าที่มี getters และ setters คุณสามารถสร้างอินสแตนซ์
enable final
กำหนดค่าทำงานในพื้นที่ทำงานของคุณ แต่เมื่อทำงานบนJenkins
มันไม่สามารถหาไฟล์นี้ ตรวจสอบว่าJenkins
กำลังค้นหาไฟล์อยู่ที่ไหนและอยู่ที่นั่นจริงหรือไม่