2008-09-21 6 views
5

Spring DA hilft beim Schreiben von DAOs. Wenn Sie iBATIS als Persistenz-Framework verwenden und SqlMapClientDaoSupport erweitern, sollte ein SqlMapClient-Mock für das DAO gesetzt werden, aber ich kann es nicht tun. SqlMapClientTemplate ist keine Schnittstelle und EasyMock kann keine Kopie dafür erstellen.Wie testet man ein DAO, das SqlMapClientDaoSupport erweitert

Antwort

1

DAO- und Unit-Tests kommen nicht gut miteinander aus! Das macht keinen Sinn, irgendetwas in einer Komponente zu verspotten, die keine Geschäftslogik enthält und sich auf den Datenbankzugriff konzentriert. Sie sollten stattdessen versuchen, einen Integrationstest zu schreiben. Sehen Sie sich die Referenzdokumentation zum Frühling an, Kapitel 8.3: http://static.springframework.org/spring/docs/2.5.x/reference/testing.html

+0

Während ich Ihre Logik sehen kann, kann ich DAO-Funktionalität ins Auge fassen, die von der Einheit profitieren könnten testen. Daher denke ich nicht, dass es fair ist zu sagen, dass DAOs nicht Unit-getestet werden sollten - alles hängt von der jeweiligen Klasse ab. – teabot

0

Versuchen Sie Mockito. Es ermöglicht Scheinklassen, nicht nur Schnittstellen.

1

Das genaue Grund ist, warum ich von SqlMapClientDaoSupport erstrecken sich nicht. Stattdessen injiziere ich eine Abhängigkeit zum SqlMapClientTemplate (getippt als die Schnittstelle SqlMapClientOperations). Hier ist ein Spring 2.5 Beispiel:

@Component 
public class MyDaoImpl implements MyDao { 

    @Autowired 
    public SqlMapClientOperations template; 

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

Und noch ein Grund, warum Zusammensetzung besser ist als Vererbung. –

1

Als @Banengusk vorgeschlagen - dies kann mit Mockito erreicht werden. Es ist jedoch wichtig, festzustellen, dass Ihr DAO einen Spring SqlMapClientTemplate verwendet, der Ihren Schein SqlMapClient umschließt. Tatsächlich delegiert SqlMapClientTemplate Aufrufe an die SqlMapSession in der IBatis-Schicht.

daher einige zusätzliche Mock-Setup ist erforderlich:

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

Wir können dann Verhalten überprüfen wie so:

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