如何在某些测试中禁用flappedoodle嵌入式mongodb

der*_*itz 1 java junit mongodb spring-data spring-boot

我基于Spring Initializr(渐变风味)创建了一个Spring Boot应用程序。

我还加了

compile('org.springframework.boot:spring-boot-starter-data-mongodb')
Run Code Online (Sandbox Code Playgroud)

使用MongoDB进行持久化。我还添加了一个可以正常工作的简单集成测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class TileServiceApplicationTests {

    @Autowired
    private MockMvc mvc;

    @Autowired
    private UserSettingRepository userSettingRepository;

    @Test
    public void contextLoads() throws Exception {
        Folder folder = random( Folder.class, "color", "elements" );
        EserviceTile eserviceTile1 = random( EserviceTile.class , "color");
        EserviceTile eserviceTile2 = random( EserviceTile.class, "color" );
        folder.setElements( Arrays.asList(eserviceTile1) );
        TileList usersTiles = new TileList( Arrays.asList( folder, eserviceTile2 ) );

        userSettingRepository.save( new UserSetting( "user1", usersTiles ));


        String string = mvc.perform( get( "/user1" ) ).andExpect( status().isOk() ).andReturn().getResponse().getContentAsString();
        Assert.assertThat(string, allOf( containsString( eserviceTile1.getName() ), containsString( eserviceTile2.getName() ) ) );
    }

}
Run Code Online (Sandbox Code Playgroud)

如果mongodb在默认端口上运行,我看到数据仍然存在。为了独立于运行mongo,我刚刚添加了:

 testCompile('de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.1.1')
Run Code Online (Sandbox Code Playgroud)

瞧,测试无需mongo!(没什么可补充的)

我的问题是:我想对某些测试禁用嵌入式Mongo。最简单的方法是什么?

Vit*_*aly 8

嵌入式Mongo守护程序从开始EmbeddedMongoAutoConfiguration。您可以通过EmbeddedMongoAutoConfiguration从扫描中排除来禁用守护程序启动的单个测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(properties = "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration")
public class DoNotStartMongoTest {
    //...

    @Test
    public void test() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢相反的功能:按需启动嵌入式Mongo守护程序。为此,您需要EmbeddedMongoAutoConfiguration在生产代码中排除:

@EnableMongoRepositories
@SpringBootApplication(exclude = EmbeddedMongoAutoConfiguration.class)
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在测试代码中添加注释,这将使嵌入式Mongo守护程序启动:

@Retention(RUNTIME)
@Target(TYPE)
@Import(EmbeddedMongoAutoConfiguration.class)
public @interface EnableEmbeddedMongo {
}
Run Code Online (Sandbox Code Playgroud)

并注释您的测试:

@RunWith(SpringRunner.class)
@SpringBootTest
@EnableEmbeddedMongo
public class StartMongoTest {
    //...

    @Test
    public void test() {
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用这种方法,我发现“@DataMongoTest”已经实现了“@EnableEmbeddedMongo”的目标。这使得首先停用自动配置的想法是一个很棒的想法 (2认同)