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
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
Versuchen Sie Mockito. Es ermöglicht Scheinklassen, nicht nur Schnittstellen.
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);
}
}
Und noch ein Grund, warum Zusammensetzung besser ist als Vererbung. –
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"));
- 1. Wie testet man ein Webformular?
- 2. Wie testet man ein Clojure-Makro, das Gensyms verwendet?
- 3. Wie man beide HTML-Seiten macht/testet/und/testet/testet
- 4. Wie benennt man ein Objekt im DAO-Paket, das im Modell den gleichen Namen hat?
- 5. Wie erweitert man ein Array in Swift?
- 6. Ein DAO von einem anderen DAO aufrufen?
- 7. Wie testet man mit MediatR
- 8. Wie testet man die Ereignisauslösung?
- 9. Wie testet man Enum-Typen?
- 10. Ein DAO pro Thread oder threadsafe DAO?
- 11. Wie testet man eine Webapplikation?
- 12. Wie testet man jQuery-Tastaturereignisse?
- 13. Ein DAO pro "Container" -Klasse oder ein DAO pro Tabelle?
- 14. Wie testet man das Beispielprojekt angular-reactive-native-renderer?
- 15. Wie testet man das Schreiben in einen Dateifreigabepfad mit Anmeldeinformationen?
- 16. Wie testet man das angular $ destroy-Ereignis in einer Direktive?
- 17. Wie erstellt man ein DAO für Join-Tabellen?
- 18. Wie testet man das Schließen von x-editierbarem Datepicker?
- 19. Wie testet man, ob eine Java-Klasse zur Laufzeit eine andere erweitert?
- 20. Robolectric: Wie man eine SherlockActivity testet
- 21. Wie testet man ein Protokoll für eine Methode?
- 22. Wie testet man ein Select2-Element mit Capybara DSL?
- 23. Wie testet man ein JQuery UI Sortierbares Widget mit Selen?
- 24. Wie testet man ein Makefile auf fehlende Abhängigkeiten?
- 25. Wie man ein Clojure-Projekt organisiert, testet, dokumentiert und verpackt
- 26. Wie testet man das Anmeldeformular in Laravel 5 mit Behat? Wie schreibe ich ein Feature?
- 27. Wie testet man, ob der Ort ein btrfs Subvolumen ist?
- 28. Wie spottet man eine private dao-Variable?
- 29. Wie erweitert man Python Enum?
- 30. Wie testet man eine Timer-Klasse (Adaptermuster)?
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