Komponententests mit MongoDB
Meine Datenbank der Wahl ist MongoDB. Ich Schreibe ein data-Link-layer API zu abstrahieren details zur Implementierung von client-Anwendungen - das ist, ich bin im wesentlichen die Bereitstellung einer öffentlichen Schnittstelle (ein Objekt, das als ein IDL).
Ich Teste meine Logik, weil ich in einem TDD-Weise. Vor jeder unit-test, ein @Before
Methode wird aufgerufen, um eine Datenbank zu erstellen singleton, nach dem, wenn der test abgeschlossen ist, wird eine @After
- Methode aufgerufen wird, löschen Sie die Datenbank. Dies trägt zur Förderung der Unabhängigkeit in unit-tests.
Fast alle unit-tests, d.h. die Durchführung einer contextual queryerfordern eine Art der insertion logic auftreten, bevor die hand. Meine öffentliche Schnittstelle bietet einen insert-Methode - doch es scheint falsch, diese Methode als Vorläufer Logik für jede Einheit testen.
Wirklich ich muss eine Art von Spott Mechanismus, doch ich hatte noch nicht viel Erfahrungen mit mocking frameworks, und es scheint, dass Google gibt nichts wieder ein mocking-framework, die man mit MongoDB.
Was andere auch tun in diesen Situationen? Das ist, wie machen die Leute das unit-test-code für die Interaktion mit einer Datenbank?
Außerdem ist meine öffentliche Schnittstelle, die eine Verbindung zu einer Datenbank definiert, die in einer externen Konfigurations - Datei- es scheint falsch zu verwenden, diese Verbindung für meine unit - Tests- immer wieder, eine situation, die profitieren würden, irgendeine Art von Spott?
InformationsquelleAutor der Frage wulfgarpro | 2011-09-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als sbridges schrieb in diesem post ist es eine schlechte Idee, nicht um einen dedizierten service (manchmal auch bekannt als repository oder DAO), die abstracts der Datenzugriff aus der Logik. Dann könnte man den test der Logik, indem Sie einen Nachbau des DAO.
Anderen Ansatz, was ich zu tun ist, erstellen Sie ein Mock der Mongo-Objekt (z.B. PowerMockito) und dann wieder die entsprechenden Ergebnisse.
Dies, weil Sie nicht haben, um zu testen, ob die Datenbank funktioniert in unit-tests, sondern mehr über sollten Sie testen, ob die richtige Abfrage wurde gesendet, um die databse.
Wäre das auch eine option sein. Natürlich ist die Erstellung der mocks und Rücksendung der entsprechenden Objekte nur codiert als Beispiel oben.
InformationsquelleAutor der Antwort rit
Technisch-tests, dass die Rede in eine Datenbank (nosql oder anderes) sind nicht unit-testswie die tests testen die Interaktion mit einem externen system, und nicht nur Tests eine isolierte Einheit von code. Jedoch tests, die mit der Datenbank kommunizieren, sind oft sehr hilfreich, und sind oft schnell genug zu laufen, mit der anderen unit-tests.
Normalerweise habe ich eine Dienst-Schnittstelle (z.B. UserService), die kapselt alle Logik für den Umgang mit der Datenbank. Code, der abhängig von UserService kann eine ironisierte version des UserService und ist leicht getestet.
Bei der Prüfung der Umsetzung der Service, die Gespräche, Mongo, (z.B. MongoUserService) ist es am einfachsten zu schreiben, java-code, starten/beenden einer mongo-Prozess auf dem lokalen Rechner und haben Ihre MongoUserService verbinden, finden Sie in diesem Frage für einige Hinweise.
Könnten Sie versuchen, zu verspotten, die Funktionalität der Datenbank während der Prüfung MongoUserService, aber in der Regel, dass ist viel zu fehleranfällig, und nicht testen was Sie wirklich wollen, zu testen, die eine echte Interaktion mit der Datenbank. Also, wenn das schreiben von tests für MongoUserService, richten Sie eine Datenbank-Zustand für jeden test. Blick auf DbUnit ein Beispiel für ein framework dafür mit einer Datenbank.
InformationsquelleAutor der Antwort sbridges
Schrieb ich eine MongoDB-stub-Implementierung in Java: mongo-java-server
Standard ist ein in-memory-backend, das kann leicht verwendet werden, die in Unit-und Integrationstests.
Beispiel
InformationsquelleAutor der Antwort Benedikt Waldvogel
Ich bin überrascht, niemand empfohlen, um fakemongo so weit. Es emuliert mongo client ziemlich gut, und alles läuft auf derselben JVM mit tests, integration-tests werden robust und technisch viel näher zur Wahrheit "unit-tests", da keine ausländischen system-Interaktion stattfindet. Es ist wie mit eingebetteten H2-unit-testen Sie Ihre SQL-code.
Ich war sehr zufrieden mit fakemongo in unit-tests, test-Datenbank, integration von code in end-zu-end-Art und Weise. Betrachten Sie diese Konfiguration im test-Frühjahr Kontext:
Mit dieser können Sie testen Ihren code, der verwendet MongoTemplate vom Frühjahr Kontext, und in Kombination mit nosql-Einheitjsonunitetc. Sie erhalten robuste unit-tests, die decken mongo Abfrage-code.
Ich verwendet fakemongo ohne Probleme mit mongo 3.4-Treiber und die community ist sehr nah an eine version, die 3.6 Treiber unterstützt (https://github.com/fakemongo/fongo/issues/316).
InformationsquelleAutor der Antwort int21h