2012-03-30 27 views
7

Trong mã sau vấn đề là, tôi không thể kiểm tra dao.add() mà không sử dụng dao.list(). Size() và ngược lại.Làm thế nào để kiểm tra "thêm" trong DAO mà không cần sử dụng "tìm" vv?

Phương pháp này có bình thường hoặc không chính xác không? Nếu không chính xác, làm thế nào nó có thể được cải thiện?

public class ItemDaoTest { 

    // dao to test 
    @Autowired private ItemDao dao; 

    @Test 
    public void testAdd() { 
     // issue -> testing ADD but using LIST 

     int oldSize = dao.list().size(); 
     dao.add(new Item("stuff")); 
     assertTrue (oldSize < dao.list().size()); 
    } 

    @Test 
    public void testFind() { 
     // issue -> testing FIND but using ADD 

     Item item = new Item("stuff") 
     dao.add(item); 
     assertEquals(item, dao.find(item.getId())); 
    } 
} 
+0

Bạn sau khi tích hợp hoặc kiểm tra đơn vị? – davidfrancis

+0

Bạn cho tôi biết :) Trong trường hợp cụ thể này - chỉ sử dụng cảm giác thông thường có vẻ giống như thử nghiệm tích hợp với tôi. Nhưng bạn biết, sau khi tất cả tôi chỉ muốn đảm bảo rằng DAO của tôi hoạt động, đó là nó. – Xorty

+0

Vâng, đó là một nỗi đau. Không chắc chắn bạn có thể kết thúc với các bài kiểm tra đơn vị vì sự phụ thuộc mà dao có. Con dao làm việc như thế nào? Cá nhân tôi sẽ cố gắng tránh làm cho thử nghiệm của bạn phụ thuộc vào một db bên ngoài và cố gắng khai thác hoặc giả mạo lớp truy cập db, như được đề xuất trong một trong các câu trả lời. Có nói rằng nó không bao giờ yên tâm như một bài kiểm tra tích hợp phụ thuộc db thực sự. – davidfrancis

Trả lời

2

Tôi nghĩ thử nghiệm của bạn là các bài kiểm tra tích hợp hợp lệ như đã nêu ở trên, nhưng tôi sẽ sử dụng Thêm để trợ giúp trong việc kiểm tra Tìm và ngược lại .. Ở một mức độ nào đó bạn phải cho phép mình đặt niềm tin ở mức thấp nhất tích hợp với sự phụ thuộc bên ngoài của bạn. Tôi nhận thấy có sự phụ thuộc vào các phương pháp khác trong các thử nghiệm của bạn, nhưng tôi thấy rằng phương thức Add và Find là các phương thức "mức thấp" rất dễ kiểm chứng. Về cơ bản, chúng kiểm tra lẫn nhau vì chúng là phương pháp nghịch đảo cơ bản.

Thêm có thể dễ dàng xây dựng các điều kiện tiên quyết cho tìm kiếm

Tìm có thể xác minh rằng thêm thành công.

Tôi không thể nghĩ ra một kịch bản mà một thất bại trong cả hai sẽ không được đánh bắt bằng cách thử nghiệm của bạn

0

Tôi sử dụng JDBC trực tiếp (sử dụng JdbcTemplate của Spring) để kiểm tra các phương pháp DAO. Tôi có nghĩa là tôi gọi các phương pháp DAO (đó là cơ sở Hibernate), và sau đó xác nhận chúng bằng cách sử dụng các cuộc gọi SQL trực tiếp JDBC.

+1

Nhưng điều đó có nghĩa là thêm dòng mã JDBC chưa được kiểm tra chỉ nhằm mục đích thử nghiệm ...: | – Xorty

1

Phương thức testAdd của bạn có vấn đề: nó phụ thuộc vào giả thiết rằng ItemDao.list hoạt động đúng, nhưng ItemDao là Lớp mà bạn đang thử nghiệm. Các bài kiểm thử đơn vị có nghĩa là độc lập, do đó, cách tiếp cận tốt hơn là sử dụng JDBC -as @Amir đơn giản để xác minh xem bản ghi đã được giới thiệu trong cơ sở dữ liệu hay chưa.

Nếu bạn đang sử dụng Spring, bạn có thể chuyển tiếp trên AbstractTransactionalDataSourceSpringContextTests để truy cập JDBCTemplate và đảm bảo khôi phục sau khi thử nghiệm được thực thi.

0

Các đơn vị nhỏ nhất được thử nghiệm để thử nghiệm đơn vị dựa trên lớp là một lớp.

Để xem lý do, hãy xem xét rằng bạn có thể, theo lý thuyết, kiểm tra từng phương pháp của lớp trong sự cô lập từ tất cả các phương pháp khác bằng cách bỏ qua, kéo hoặc nhai chúng. Một số công cụ có thể không hỗ trợ điều đó; đây là lý thuyết không thực hành, giả sử họ làm.

Mặc dù vậy, làm mọi thứ theo cách đó sẽ là một ý tưởng tồi. Các đặc điểm kỹ thuật của một chức năng cá nhân của chính nó sẽ thay đổi giữa mơ hồ vô nghĩa và verbosely incomprehensible. Chỉ trong mô hình tương tác giữa các chức năng khác nhau sẽ tồn tại một đặc tả đơn giản hơn mã mà bạn có thể sử dụng một cách có lợi để kiểm tra nó.

Nếu bạn thêm một mục và số lượng mục được báo cáo tăng lên, mọi thứ đang hoạt động. Nếu có một số cách mà mọi thứ không thể hoạt động được, nhưng tuy nhiên tất cả các mẫu tương tác đều giữ, thì bạn thiếu một số thử nghiệm cần thiết.

Các vấn đề liên quan