Tôi đã viết một số bài kiểm tra đơn vị cho một phương thức tĩnh. Phương thức tĩnh chỉ mất một đối số. Kiểu của đối số là một lớp cuối cùng. Về mặt mã:
public class Utility {
public static Optional<String> getName(Customer customer) {
// method's body.
}
}
public final class Customer {
// class definition
}
Vì vậy, đối với Utility
lớp tôi đã tạo ra một lớp kiểm tra, UtilityTests
trong đó tôi đã viết các bài kiểm tra cho phương thức này , getName
. Khung kiểm thử đơn vị là TestNG và thư viện giả được sử dụng là Mockito
. Vì vậy, một thử nghiệm điển hình có cấu trúc sau:
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(...);
}
}
Vấn đề là gì?
Trong khi các thử nghiệm chạy thành công cục bộ, bên trong IntelliJ, chúng thất bại trên Jenkins (khi tôi đẩy mã của mình trong nhánh từ xa, một bản dựng được kích hoạt và các thử nghiệm đơn vị chạy ở cuối). Thông báo lỗi là sth như sau:
org.mockito.exceptions.base.MockitoException: Không thể lớp mock / spy com.packagename.Customer Mockito không thể mock / spy vì: - lớp cuối cùng
Những gì tôi đã cố gắng?
Tôi đã tìm kiếm một chút, để tìm giải pháp nhưng tôi đã không thực hiện. Tôi lưu ý ở đây rằng tôi không được phép thay đổi thực tế đó Customer
là lớp cuối cùng . Ngoài ra, tôi muốn nếu không thể thay đổi thiết kế của nó (ví dụ: tạo giao diện, sẽ giữ các phương thức mà tôi muốn chế giễu và nói rằng lớp Khách hàng thực hiện giao diện đó, như chính xác mà Jose đã chỉ ra trong bình luận). Điều mà tôi đã thử là lựa chọn thứ hai được đề cập tại trận chung kết mockito . Mặc dù thực tế là điều này đã khắc phục được sự cố, nhưng nó đã phanh một số bài kiểm tra đơn vị khác :(, điều đó không thể được khắc phục theo cách rõ ràng.
Câu hỏi
Vì vậy, đây là hai câu hỏi tôi có:
- Làm thế nào là có thể ở nơi đầu tiên? Không nên thử nghiệm thất bại cả ở địa phương và ở Jenkins?
- Làm thế nào điều này có thể được sửa chữa dựa trên các ràng buộc tôi đã đề cập ở trên?
Cảm ơn trước sự giúp đỡ nào.
Customer
logic nào trong đó không, hay nó chỉ là một lớp dữ liệu câm? Nếu nó chỉ là một loạt các trường với getters và setters, thì bạn có thể khởi tạo nó.
enable final
cấu hình hoạt động trong không gian làm việc của bạn, nhưng khi chạy trênJenkins
nó không thể tìm thấy tệp này. Kiểm tra nơiJenkins
đang tìm kiếm tập tin và liệu nó thực sự có ở đó hay không.