Wie Einheit einen DAO testen, die SqlMapClientDaoSupport erweitert
Frage
Frühling DA hilft schriftlich DAOs. Wenn iBATIS als Persistenz-Framework verwenden, und ich SqlMapClientDaoSupport sollte ein SqlMapClient Mock für die DAO eingestellt werden, aber ich kann es nicht tun. SqlMapClientTemplate ist keine Schnittstelle und EasyMock kann keine Mock für sie erstellt.
Lösung
DAO und Unit-Tests erhalten nicht gut zusammen! Das macht keinen Sinn, irgendetwas in einer Komponente zu verspotten, die keine Geschäftslogik halten und auf dem Datenbankzugriff konzentriert. Sie sollten versuchen, stattdessen einen Integrationstest zu schreiben. Werfen Sie einen Blick auf die Federreferenzdokumentation, Kapitel 8.3: http: //static.springframework.org/spring/docs/2.5.x/reference/testing.html
Andere Tipps
Der genaue Grund ist, warum ich erstrecken uns nicht von SqlMapClientDaoSupport
. Stattdessen spritze ich eine Abhängigkeit der SqlMapClientTemplate
(als Schnittstelle SqlMapClientOperations
eingegeben). 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);
}
}
Wie @Banengusk vorgeschlagen - kann dies erreicht werden durch Mockito . Allerdings ist es wichtig festzustellen, dass Ihr DAO wird eine Feder SqlMapClientTemplate
wird, die Ihren Mock SqlMapClient
einwickelt. Infact, SqlMapClientTemplate
Delegierten Anrufungen der SqlMapSession
in der iBatis Schicht.
Deshalb 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 folgt:
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"));
Versuchen Sie Mockito . Es läßt Mock Klassen, nicht nur Schnittstellen.