mardi 30 juillet 2019

How to configure spring boot test in maven multi-module project to scan appropriate multi properties(application.yml)

My project structure is as follows

demo-ecommerce/ ├── HELP.md
├── api
│     ├── api.iml
│     ├── pom.xml
│     └── src
│             ├── main
│             │     ├── java
│             │     │     └── com.demoecommerce.api
│             │     │             ├── ApiApplication.java
│             │     │             └── other sub packages
│             │     └── resources
│             │     └── application.yml
│             └── test
│                     ├── java
│                     │     └── com.demoecommerce.api
│                     │     └── ApiApplicationTests.java
│                     └── resources
│                              └── application-test.yml
├── common
│     ├── common.iml
│     ├── pom.xml
│     └── src
│         ├── main
│         │     ├── java
│         │     │     └── com.demoecommerce
│         │     │     ├── CommonApplication.java
│         │     │     └── Other sub packages
│         │     └── resources
│         │     ├── application-core.yml
│         │     └── messages.properties
│         └── test
│                 └── java
│                 └── com.demoecommerce
│                         └── CommonApplicationTests.java
├── demo-ecommerce.iml
├── mvnw
├── mvnw.cmd
├── pom.xml
└── web
        ├── pom.xml
        ├── src
        │     ├── main
        │     │     ├── java
        │     │     │     └── com.demoecommerce.web
        │     │     │             ├── WebApplication.java
        │     │     │             └── Other sub packages
        │     │     └── resources
        │     │             ├── application.yml
        │     │             ├── static
        │     │             └── templates
        │     └── test
        │     └── java
        │     └── com.demoecommerce.web
        │     └── WebApplicationTests.java
        └── web.iml

api

ApiApplication.java

package com.demoecommerce.api;

@SpringBootApplication(scanBasePackages = {"com.demoecommerce.api","com.demoecommerce"})
public class ApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }
}

application.yml in api resources

spring:
  profiles:
    include:
      - core
...

ApiApplicationTests.java

package com.demoecommerce.api;

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class ApiApplicationTests {

    @Test
    public void contextLoads() {
    }

}

application-test.yml in test api resources

spring:
  profiles:
    include:
      - core
  datasource:
    username: sa
    password:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    hikari.jdbc-url: jdbc:h2:mem:testdb
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect

common

CommonApplication.java

package com.demoecommerce;

@SpringBootApplication
@PropertySource(value = {"application-core.yml"})
public class CommonApplication {

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

application-core.yml in common

spring:
  profiles:
    active: core
  datasource:
    username: demo
    password: 1234
    url: jdbc:mysql://127.0.0.1:3306/demoecommerce?characterEncoding=UTF-8&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update
    properties:
      .hibernate:
        show_sql: true
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect

logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
        type:
          descriptor:
            sql:
              BasicBinder: TRACE
      springframework:
        security: DEBUG

Error

Run 'ApiApplicationTests'

java.lang.IllegalStateException: Failed to load ApplicationContext

 at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
 at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
 at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
 at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
 at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
 at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
 at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
 at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
 at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
 at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
 at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
 at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.demoecommerce.api.ApiApplication]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/application-core.yml]
 at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:181)
 at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315)
 at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
 at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
 at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
 at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705)
 at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
 at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:742)
 at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:389)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:311)
 at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:119)
 at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
 at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)
 ... 24 more
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/application-core.yml]
 at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:158)
 at org.springframework.core.io.support.EncodedResource.getInputStream(EncodedResource.java:159)
 at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:99)
 at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:73)
 at org.springframework.core.io.support.PropertiesLoaderUtils.loadProperties(PropertiesLoaderUtils.java:59)
 at org.springframework.core.io.support.ResourcePropertySource.<init>(ResourcePropertySource.java:67)
 at org.springframework.core.io.support.DefaultPropertySourceFactory.createPropertySource(DefaultPropertySourceFactory.java:37)
 at org.springframework.context.annotation.ConfigurationClassParser.processPropertySource(ConfigurationClassParser.java:452)
 at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:271)
 at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
 at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191)
 at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295)
 at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242)
 at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199)
 at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
 ... 36 more



Run 'ApiApplication' is successfully executed.
However, the error happens above when running 'ApiApplicationTests'. I know that's because ApiApplication finds application-core.yml in [com.demoecommerce.api.ApiApplication] instead of [com.demoecommerce], but I don't know why my application finds it in [com.demoecommerce.api.ApiApplication].

For your infomation, Run 'WebApplication causes the same problem. If you need more info, you can ask me any time.

Thank you so much for reading my question!

Aucun commentaire:

Enregistrer un commentaire