2016-06-03 2 views
1

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

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

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

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

ответ

0

Вопрос заключается

Как проверить фляги проекты, если они не включают в себя стартер?

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

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

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

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

Рассматривается интеграционное тестирование.

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

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

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

+1

Кстати, вы по-прежнему можете включить весовые зависимости в подмодулях в тестовой области и выполнить единичный тест! – alexbt

+0

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

+0

Я понимаю, что вы имеете в виду, и я согласен с тем, что больше тестов, тем лучше! (Не имеет значения, являются ли они единицей, intg ...). Дело в том, что мы говорим о «Весенней загрузке», и большая часть конфигурации находится в application.properties, не видимой для подмодулей. Использование @SpringBootTest в подмодулях потребует определенной установки для тестов, а затем я не уверен, что вы фактически тестируете свой производственный контекст. Ваш «тестовый» контекст может очень хорошо работать, пока ваша продукция терпит неудачу. Пожалуйста, ответьте на это своими мыслями. – alexbt

3

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

  1. «Lib» проект с доменными и коммунальных классов,
  2. «веб» проектов с применением пружинного загрузки, шаблоны, контроллеры и т.д. ...

и я хотел протестировать проект «lib» в режиме весенней загрузки.

Прежде всего, включите необходимые зависимости с областью действия «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.orm.jpa.EntityScan; 
    import org.springframework.context.annotation.Configuration; 
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 

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

    } 

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

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

@RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(classes = TestConfiguration.class) 
    public class TestAClassThatNeedsSpringRepositories 
    { 
     // tests... 
    } 
3

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

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

@SpringBootApplication() 
@EnableAutoConfiguration() 
public class TestApplication { 

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

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

@RunWith(SpringRunner.class) 
//@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
//@TestExecutionListeners({DependencyInjectionTestExecutionListener.class}) 
//@ContextConfiguration() 
@ActiveProfiles(profiles = {Profiles.WEB_REST}) 
//@TestPropertySource("/config/rest.yml") 
@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()); 
    } 
} 
+0

Удивительный! Это должен быть принятый ответ – Chinmay