Tôi đang làm việc trên một dự án nơi các cuộc gọi nội bộ của lớp là bình thường nhưng kết quả là các giá trị đơn giản gấp nhiều lần. Ví dụ ( không phải mã thật ):
public boolean findError(Set<Thing1> set1, Set<Thing2> set2) {
if (!checkFirstCondition(set1, set2)) {
return false;
}
if (!checkSecondCondition(set1, set2)) {
return false;
}
return true;
}
Viết các bài kiểm tra đơn vị cho loại mã này thực sự khó vì tôi chỉ muốn kiểm tra hệ thống điều kiện chứ không phải thực hiện các điều kiện thực tế. (Tôi làm điều đó trong các thử nghiệm riêng biệt.) Trong thực tế sẽ tốt hơn nếu tôi vượt qua các chức năng thực hiện các điều kiện và trong các thử nghiệm tôi chỉ đơn giản cung cấp một số giả. Vấn đề với cách tiếp cận này là sự ồn ào: chúng tôi sử dụng thuốc generic rất nhiều .
Một giải pháp làm việc; tuy nhiên, là làm cho đối tượng được thử nghiệm trở thành một gián điệp và chế nhạo các cuộc gọi đến các chức năng bên trong.
systemUnderTest = Mockito.spy(systemUnderTest);
doReturn(true).when(systemUnderTest).checkFirstCondition(....);
Mối quan tâm ở đây là việc triển khai của SUT được thay đổi một cách hiệu quả và có thể có vấn đề khi giữ các thử nghiệm đồng bộ với việc triển khai. Điều này có đúng không? Có thực hành tốt nhất để tránh sự tàn phá của các cuộc gọi phương thức nội bộ này không?
Lưu ý rằng chúng ta đang nói về các phần của một thuật toán, do đó, việc chia nó ra một vài lớp có thể không phải là một quyết định mong muốn.