2008-09-21 97 views

回答

1

DAO和單元測試相處得不好! 在沒有任何業務邏輯並專注於數據庫訪問的組件中嘲笑任何東西都沒有意義。 你應該嘗試寫一個集成測試。看看春季參考文件,章節8.3:http://static.springframework.org/spring/docs/2.5.x/reference/testing.html

+0

雖然我可以看到你的邏輯,我可以設想,可以從單位受益DAO功能測試。因此,我認爲公平地說,DAO不應該進行單元測試 - 這一切都取決於有問題的班級。 – teabot 2010-06-16 10:47:41

0

嘗試Mockito。它允許模擬類,而不僅僅是接口。

1

這個確切的原因是我爲什麼不從SqlMapClientDaoSupport延伸。相反,我注入依賴SqlMapClientTemplate(鍵入爲接口SqlMapClientOperations)。這裏有一個Spring 2.5的例子:

@Component 
public class MyDaoImpl implements MyDao { 

    @Autowired 
    public SqlMapClientOperations template; 

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

另一個爲什麼組合比繼承更好的原因。 – 2010-08-30 13:37:32

1

正如@Banengusk建議 - 這可以通過Mockito來實現。但是,確定您的DAO將使用包含您的模擬SqlMapClient的Spring SqlMapClientTemplate非常重要。事實上,SqlMapClientTemplate委託調用IBatis層中的SqlMapSession

因此一些額外的模擬設置要求:

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); 

然後,我們可以驗證的行爲,像這樣:

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"));