2017-02-07 4 views
1

Ich habe einen Test, der einige Entitäten instanziiert, sie in MongoDB speichert und sie erneut lädt, um sicherzustellen, dass das Mapping korrekt funktioniert. Ich möchte die Annotation @DataMongoTest für die Testklasse verwenden, um sicherzustellen, dass eine eingebettete MongoDB-Instanz dynamisch erstellt wird.Wie benutze ich benutzerdefinierte Konverter mit @DataMongoTest?

Dies funktionierte gut, bis ich benutzerdefinierte Konverter (org.springframework.core.convert.converter.Converter) für einige Klassen einführen musste. Diese sind wie folgt aufgebaut:

@ReadingConverter 
public class MyClassReadConverter implements Converter<Document, MyClass> { 
... 

@WritingConverter 
public class MyClassWriteConverter implements Converter<MyClass, Document> { 
... 

@Configuration 
public class SpringMongoSetup extends AbstractMongoConfiguration { 
    @Override 
    public Mongo mongo() throws Exception { 
     //I don't want that in the test.. 
     return new MongoClient("localhost"); 
    } 

    @Override 
    public CustomConversions customConversions() { 
     // ..but I need this 
     List<Converter<?,?>> converters = new ArrayList<>(); 
     converters.add(new MyClassWriteConverter()); 
     converters.add(new MyClassReadConverter()); 
     return new CustomConversions(converters); 
    } 
... 

Für normale (nicht test) Ausführung funktioniert das gut. Der Test funktioniert auch, wenn ich die Annotation @SpringBootTest verwende, die den Test meine Konfiguration verwendet. Leider definiert diese Konfiguration auch den Host/Port für MongoDB, aber ich möchte den Host/Port der eingebetteten MongoDB verwenden, die von @DataMongoTest gestartet wurde.

Kann ich es irgendwie so konfigurieren, dass entweder @DataMongoTest die benutzerdefinierten Konverter mit der eingebetteten MongoDB verwendet, oder dass ich den eingebetteten Host/Port beim Instantiieren meiner Konfigurationsklasse bekommen kann?

Antwort

0

Wenn Sie Slicing verwenden, werden alle Scans deaktiviert, die für Mongo nicht relevant sind. Wir haben keine Möglichkeit zu wissen, dass Ihr SpringMongoSetup zu Mongo so verwandt ist, da wir es nicht scannen, es wird nicht angewandt.

Wenn Sie sich nicht auf die automatische Konfiguration von Mongo verlassen, müssen Sie diese Klasse selbst importieren. Sie können dies mit @Import, z.B.

@RunWith(SpringRunner.class) 
@DataMongoTest 
@Import(SpringMongoSetup.class) 
public class MyMongoTest { ... } 
+0

Das verwendet auch den Host/ip konfiguriert in 'SpringMongSetup'. (Ich habe den '@Override öffentlichen Mongo mongo() {..}' Teil in der Frage weggelassen, weil er für 'AbstractMongoConfiguration' zwingend erforderlich ist - ich habe ihn jetzt bearbeitet) Wie kann ich das überschreiben, um die eingebettete MongoDB von zu starten '@ DataMongoTest'? –

Verwandte Themen