Как протестировать проект модуля Maven с помощью Spring Boot

Я разделил проект, основанный на Spring Boot, на несколько модулей Maven. Сейчас только вар-проект содержит стартовый класс (имеющий основной метод, запускающий Spring), остальные модули имеют тип jar.

Как тестировать проекты jar, если они не включают стартер?

Пример заголовка теста JUnit:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(StarterClassInDifferentProject.class)
...

person Stefan    schedule 03.06.2016    source источник


Ответы (3)


Я думаю, что контекстные тесты должны быть доступны для каждого модуля, чтобы вы могли найти проблемы с проводами и конфигурацией на ранней стадии и не зависеть от ваших полных тестов приложения, чтобы найти их.

Я работал над этой проблемой с классом тестового приложения в том же модуле. Убедитесь, что этот основной класс находится в вашем каталоге test.

@SpringBootApplication
public class TestApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
}

ваш контекст должен работать сейчас.

@RunWith(SpringRunner.class)
@ActiveProfiles(profiles = {Profiles.WEB_REST})
@WebMvcTest(EntityController.class)
@DirtiesContext
public class ServicesControllerTest {

    @Autowired
    private MockMvc mvc;

    @MockBean
    private Controller controller;

    @Test
    public void testAll() throws Exception {
        given(controller.process(null)).willReturn(null);

        mvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk());
    }
}
person Gadi    schedule 27.09.2016

Я решал аналогичную ситуацию. У меня есть проект с двумя модулями:

  1. проект "lib" с классами домена и утилит,
  2. «веб-проекты» с загрузочным приложением spring, шаблонами, контроллерами и т. д.

и я хотел протестировать проект "lib" в режиме spring-boot-test.

Во-первых, включите необходимые зависимости с областью действия «тест» в pom.xml (в моем случае есть также база данных H2):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>1.3.3.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <!-- add also add this here, even if in my project it is already present as a regular dependency -->
     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>1.3.3.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.191</version>
        <scope>test</scope>
    </dependency>

В целях тестирования среди тестовых источников проекта «lib» у меня есть класс, который действует как моя тестовая конфигурация.

    package my.pack.utils;

    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.domain.EntityScan;
    import org.springframework.boot.test.context.TestConfiguration;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

    @TestConfiguration
    @EnableJpaRepositories(basePackages = {"my.pack.engine.storage", "my.pack.storage"})
    @EntityScan(basePackages = {"my.pack.storage", "my.pack.entity"})
    @EnableAutoConfiguration
    public class MyTestConfiguration
    {

    }

Это настраивает базу данных H2 для проверки функций доступа к данным приложения.

Наконец, только в тестовых классах, где я считаю это полезным, я настраиваю выполнение для использования тестовой конфигурации (мне не всегда нужно это делать, но иногда это удобно):

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = MyTestConfiguration.class)
    public class TestAClassThatNeedsSpringRepositories
    {
        // tests...
    }
person Evil Toad    schedule 14.06.2016

Вопрос в том

Как тестировать проекты jar, если они не включают стартер?

Я считаю, что правильный ответ заключается в том, что ваши подмодули jar не должны быть протестированы с контекстом весенней загрузки.

Фактически, большинство, если не все тесты в ваших проектах jar не должны даже использовать RunWith(Spring...). Они должны быть ванильными или использовать фиктивную библиотеку, такую ​​как @RunWith(MockitoJUnitRunner.class).

Если вы читали javadoc SpringApplicationConfiguration:

Аннотация на уровне класса, используемая для определения того, как загружать и настраивать ApplicationContext для интеграционных тестов.

Это считается интеграционным тестированием.

Помимо этого, вы также можете запускать свои тесты, используя контекст Spring (не spring-boot) с «конфигурацией тестовой пружины» в вашем подмодуле jar. Определите свои компоненты/ресурсы и используйте их в своем тесте.

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(TestConfigInJarModule.class)

Например, я делаю это для тестирования репозиториев данных Spring, используя тестовую конфигурацию spring (без зависимостей от spring-boot).

person alexbt    schedule 03.06.2016
comment
Кстати, вы все еще можете включить зависимости spring-boot в свои подмодули в области тестирования и выполнить модульное тестирование с ним! - person alexbt; 03.06.2016
comment
Я не согласен, я думаю, что модульное приложение должно тестироваться модуль за модулем даже в контексте приложения. вы можете обнаружить проблемы с конфигурацией на ранней стадии, не дожидаясь полного тестирования приложения. - person Gadi; 27.09.2016
comment
Я понимаю, что вы имеете в виду, и я согласен с тем, что чем больше тестов, тем лучше! (Неважно, являются ли они единицами, целыми...). Дело в том, что мы говорим о загрузке Spring, и большая часть конфигурации находится в application.properties, не видимых для подмодулей. Использование @SpringBootTest в подмодулях потребует специальной настройки для тестов, и тогда я не уверен, что вы на самом деле больше тестируете свой производственный контекст. Ваш «тестовый» контекст вполне может работать, в то время как ваш производственный не работает. Пожалуйста, ответьте на ваши мысли по этому поводу. - person alexbt; 27.09.2016
comment
Одна вещь, которую я почти всегда запускаю с помощью SpringBoot, — это слой сохранения (репо данных Spring), поддерживаемый базой данных памяти, все настройки из application.properties. Это позволяет мне протестировать сохранение/найти... и в основном служит для проверки моей модели jpa (то же самое касается любой другой реализации постоянства, такой как mongodb, SOLR...). Основная причина, по которой я начинаю использовать SpringBoot Boot, заключается в том, насколько проста его конфигурация, но он вообще не тестирует производственный пружинный контекст. - person alexbt; 27.09.2016
comment
Мы делим наши приложения на профили и включаем элемент конфигурации для каждого профиля, поэтому основная конфигурация соответствует ядру, а конфигурация jpa соответствует jpa. Spring очень хорошо сканирует наши модули на наличие классов конфигурации и выбирает все необходимые конфиги. еще одна причина делать тесты в контексте модуля без приложения. - person Gadi; 27.09.2016