如何使用@DataMongoTest自定义转换器?

时间:2017-02-07 16:13:42

标签: java spring mongodb spring-boot spring-data-mongodb

我有一个测试实例化一些实体,将它们保存到MongoDB并再次加载它们以确保映射正确地工作。我想在测试类上使用@DataMongoTest注释来确保动态创建嵌入式MongoDB实例。

这很好用,直到我不得不为某些类引入自定义转换器(org.springframework.core.convert.converter.Converter)。这些设置如下:

@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);
    }
...

对于正常(非测试)执行,这很好用。如果我使用@SpringBootTest注释使测试使用我的配置,该测试也有效。不幸的是,这个配置还定义了MongoDB的主机/端口,但是我想使用@DataMongoTest启动的嵌入式MongoDB的主机/端口。

我可以以某种方式配置它,以便@DataMongoTest使用嵌入式MongoDB的自定义转换器,或者我可以在实例化配置类时获取嵌入式主机/端口吗?

2 个答案:

答案 0 :(得分:0)

如果您正在使用切片,我们将禁用与Mongo无关的所有扫描。我们无法知道您的SpringMongoSetup与Mongo有关,因为我们不扫描它,所以它不适用。

如果您不依赖Mongo的自动配置,则必须自己导入该类。您可以使用@Import,例如

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

答案 1 :(得分:0)

要将docker-composeCustomConverters一起使用,您需要将这些转换器公开为Spring bean,例如:

@DataMongoTest

...并在Mongo测试类中使用配置:

@Configuration 
public class CustomConversionsConfiguration {

    @Bean
    public CustomConversions customConversions() {
        List<Converter<?,?>> converters = new ArrayList<>();
        converters.add(new MyClassWriteConverter());
        converters.add(new MyClassReadConverter());
        return new CustomConversions(converters);
    }

}