Как отключить встроенный mongodb flapdoodle в определенных тестах

Я создал приложение для весенней загрузки на основе Spring Initializr (вкус градиента).

Я также добавил

compile('org.springframework.boot:spring-boot-starter-data-mongodb')

Чтобы использовать 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() ) ) );
    }

}

Если mongodb работает на порте по умолчанию, я вижу, что данные сохраняются. Быть независимо от запущенного mongo, я только что добавил:

 testCompile('de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.1.1')

и вуаля тест проходит без монго! (больше нечего добавить)

Моя проблема: Я хочу отключить встроенный Mongo для определенных тестов. Как проще всего этого добиться?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
4 068
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Встроенный демон 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() {
    }
}

Я бы предпочел противоположную функциональность: запускать встроенный демон Mongo по запросу. Для этого вам нужно исключить EmbeddedMongoAutoConfiguration из производственного кода:

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

Затем в тестовом коде добавьте аннотацию, которая позволит запускать встроенный демон Mongo:

@Retention(RUNTIME)
@Target(TYPE)
@Import(EmbeddedMongoAutoConfiguration.class)
public @interface EnableEmbeddedMongo {
}

И аннотируйте свой тест:

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

    @Test
    public void test() {
    }
}

Довольно забавно добавлять данные, относящиеся к тестированию, в производственный код, согласитесь, что гораздо разумнее включить его, чем выключить в тестах.

Gilad Peleg 21.02.2019 16:49

Используя этот подход, я понял, что @DataMongoTest уже делает то, к чему стремится @EnableEmbeddedMongo. Что делает идею отключения автоконфигурации в первую очередь отличной.

xetra11 11.03.2021 11:37

Другие вопросы по теме