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

Posted

技术标签:

【中文标题】如何在 @DataMongoTest 中使用自定义转换器?【英文标题】:How to use custom converters with @DataMongoTest? 【发布时间】:2017-06-24 23:38:36 【问题描述】:

我有一个实例化一些实体的测试,将它们保存到 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 的自定义转换器,或者我可以在实例化我的配置类时获取嵌入式主机/端口?

【问题讨论】:

为这个老问题提供更多背景信息 - 有没有办法分离连接字符串和 mongo 转换器配置?在使用可能的内存数据库进行测试期间,您可以有一个没有另一个吗?还是必须与真实数据库进行集成测试? 【参考方案1】:

要将 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);
    


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

@RunWith(SpringRunner.class)
@DataMongoTest
@Import(CustomConversionsConfiguration.class)
public class MyMongoTest  ... 

【讨论】:

【参考方案2】:

如果您使用切片,我们将禁用所有与 Mongo 无关的扫描。我们无法知道您的SpringMongoSetup 是否与 Mongo 有关,所以我们不扫描它,所以它没有被应用。

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

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

【讨论】:

这也使用SpringMongoSetup中配置的主机/IP。 (我在问题中省略了@Override public Mongo mongo() .. 部分,因为它对于AbstractMongoConfiguration 是强制性的 - 我现在已经编辑了它)如何覆盖它以使用@DataMongoTest 启动的嵌入式MongoDB?

以上是关于如何在 @DataMongoTest 中使用自定义转换器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义模块(Joomla 1.7)中使用自定义组件中的函数?

如何在Dynamic CRM 2011中使用自定义Workflow

如何在shader中使用自定义函数

iOS - 如何在自定义单元格中使用继承?

在Delphi中如何使用SQL自定义函数,参数怎样传递给自定义函数?

如何在Qt中使用自定义数据类型