2008-09-21 34 views

Trả lời

1

DAO và kiểm tra đơn vị không hoạt động tốt! Điều đó không có ý nghĩa khi giả lập bất kỳ thứ gì trong một thành phần không chứa bất kỳ logic nghiệp vụ nào và tập trung vào truy cập cơ sở dữ liệu. Bạn nên thử thay vì viết bài kiểm tra tích hợp. Hãy xem tài liệu tham chiếu mùa xuân, chương 8.3: http://static.springframework.org/spring/docs/2.5.x/reference/testing.html

+0

Trong khi tôi có thể nhìn thấy logic của bạn, tôi có thể dự tính chức năng DAO có thể hưởng lợi từ đơn vị thử nghiệm. Vì vậy, tôi không nghĩ rằng nó công bằng khi nói rằng DAO không nên được kiểm tra đơn vị - tất cả phụ thuộc vào lớp học được đề cập. – teabot

0

Hãy thử Mockito. Nó cho phép các lớp mô phỏng, không chỉ các giao diện.

1

Lý do chính xác này là lý do tôi không gia hạn từ SqlMapClientDaoSupport. Thay vào đó, tôi tiêm phụ thuộc vào SqlMapClientTemplate (được nhập là giao diện SqlMapClientOperations). Dưới đây là một mùa xuân 2,5 Ví dụ:

@Component 
public class MyDaoImpl implements MyDao { 

    @Autowired 
    public SqlMapClientOperations template; 

    public void myDaoMethod(BigInteger id) { 
     int rowcount = template.update("ibatisOperationName", id); 
    } 
} 
+2

Và một lý do khác tại sao Thành phần lại tốt hơn Thừa kế. –

1

Như @Banengusk gợi ý - điều này có thể đạt được với Mockito. Tuy nhiên, điều quan trọng là thiết lập rằng DAO của bạn sẽ sử dụng một Spring SqlMapClientTemplate kết thúc tốt đẹp mô phỏng của bạn SqlMapClient. Infact, SqlMapClientTemplate ủy quyền các cuộc gọi đến SqlMapSession trong lớp IBatis.

Vì thế một số thiết lập mô hình bổ sung là cần thiết:

mockSqlMapSession = mock(SqlMapSession.class); 
mockDataSource = mock(DataSource.class); 

mockSqlMapClient = mock(SqlMapClient.class); 
when(mockSqlMapClient.openSession()).thenReturn(mockSqlMapSession); 
when(mockSqlMapClient.getDataSource()).thenReturn(mockDataSource); 

dao = new MyDao(); 
dao.setSqlMapClient(mockSqlMapClient); 

Sau đó chúng tôi có thể xác minh hành vi như vậy:

Entity entity = new EntityImpl(4, "someField"); 
dao.save(entity); 

ArgumentCaptor<Map> params = ArgumentCaptor.forClass(Map.class); 
verify(mockSqlMapSession).insert(eq("insertEntity"), params.capture()); 
assertEquals(3, params.getValue().size()); 
assertEquals(Integer.valueOf(4), params.getValue().get("id")); 
assertEquals("someField", params.getValue().get("name")); 
assertNull(params.getValue().get("message")); 
Các vấn đề liên quan