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

Jiř*_*aml 8 java spring mongodb spring-data-mongodb spring-boot

我有一个测试实例化一些实体,将它们保存到 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);
    }
...
Run Code Online (Sandbox Code Playgroud)

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

我可以以某种方式对其进行配置,以便@DataMongoTest将自定义转换器与嵌入式 MongoDB 一起使用,或者在实例化我的配置类时获得嵌入式主机/端口吗?

jrd*_*jrd 6

要使用CustomConverters@DataMongoTest您需要将这些转换器公开为 Spring bean,例如:

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

}
Run Code Online (Sandbox Code Playgroud)

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

@RunWith(SpringRunner.class)
@DataMongoTest
@Import(CustomConversionsConfiguration.class)
public class MyMongoTest { ... }
Run Code Online (Sandbox Code Playgroud)


Ste*_*oll 0

如果您使用切片,我们将禁用所有与 Mongo 无关的扫描。我们无法知道您的SpringMongoSetup内容与 Mongo 相关,因此,由于我们不扫描它,因此它不会被应用。

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

@RunWith(SpringRunner.class)
@DataMongoTest
@Import(SpringMongoSetup.class)
public class MyMongoTest { ... }
Run Code Online (Sandbox Code Playgroud)