2016-08-10 59 views
1

我有一個彈簧引導gradle應用程序。當我運行gradle構建時,我想針對不同的環境運行。系統屬性-Dspring.profiles.active不可用在彈簧啓動測試配置在gradle build

例如:./gradlew clean build -Dapp.env=QA1。在測試代​​碼中,我想檢查這個屬性並相應地收集測試數據。我觀察到的是屬性(app.env)不可用。

由於測試檢查系統屬性,構建應該失敗。但構建是成功的。我也沒有在控制檯中看到println語句。

,如果你想克隆回購:

混帳克隆https://[email protected]/SpringDevSeattle/gs-rest-service.git

這裏是我的測試代碼:

的src /測試/ JAVA /你好/ GreetingControllerTests.java

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@ContextConfiguration(classes={hello.TestConfig.class,hello.AppConfig.class}) 
@WebAppConfiguration 
public class GreetingControllerTests { 


    @Autowired 
    TestEnv testEnv; 

    @Autowired 
    Status status; 

    private String env; 

    @Before 
    public void init(){ 
     System.out.println(status.getName()); 
     env=testEnv.getEnv(); 
    } 

    @Test 
    public void should_fail(){ 
     if (env.equalsIgnoreCase("DEV")){ 
      assertThat(false).isFalse(); 
     } 
     if (env.equalsIgnoreCase("QA1")){ 
      System.out.println("failing the test"); 
      fail(); 
     } 
    } 

} 

src/test/java/hello/TestConfig.java

@Configuration 
public class TestConfig { 


    @Bean 
    public TestEnv testEnv(){ 
     Properties properties = System.getProperties(); 
     String env = properties.getProperty("app.env"); 
     System.out.println(env); 
     if (env==null){ 
      env="dev"; 
     } 
     return new TestEnv(env); 
    } 
} 

的src /測試/ JAVA /你好/ TestEnv.java

public class TestEnv { 


     private String env; 

     public TestEnv(String env){ 
      this.env=env; 
     } 

     public String getEnv() { 
      return env; 
     } 

     public void setEnv(String env) { 
      this.env = env; 
     } 
} 

的src /主/ JAVA /你好/ AppConfig.java

@Configuration 
public class AppConfig { 

    @Value("${app.version}") 
    private String version; 
    @Value("${app.name}") 
    private String name; 


    @Bean 
    public Status status(){ 
     return new Status(name,version); 
    } 

} 

我的最終目標是爲基於-Dapp.env的測試設置「spring.profiles.active」。但我目前沒有看到gradle運行中拾取的系統屬性。

編輯

即使./gradlew clean build -Dspring.profiles.active=QA1,我沒有看到它的工作。

測試相應地改變了這一點。

@Autowired 
Environment envi 

@Before 
    public void init(){ 
     System.out.println("*********-IN THE INIT METHOD **********"); //new line added 
     System.out.println(status.getName()); 
     env=envi.getActiveProfiles()[0]; 
    } 

@Test 
    public void should_fail(){ 
     if (env.equalsIgnoreCase("DEV")){ 
      assertThat(false).isFalse(); 
     } 
     if (env.equalsIgnoreCase("QA1")){ 
      System.out.println("failing the test"); 
      fail(); 
     } 
    } 

生成失敗在任一情況下-Dspring.profiles.active=DEV-Dspring.profiles.active=QA1

回答

2

搖籃在一個單獨的JVM執行測試。因此,在命令行中指定的系統屬性用於生成 JVM中,並且不會傳播到測試JVM。這是爲了將測試過程與構建過程隔離開來的。您可以像這樣明確地爲測試過程明確指定系統屬性。

test { 
    systemProperty 'key', 'value' 
} 

或者,也可以簡單地通過所有系統屬性來測試過程,這將允許用戶指定他們經由-D語法在命令行上。

test { 
    systemProperties = System.props 
} 
+0

是的,在我的build.gradle中添加這個之後,我看到預期的行爲。但我沒有看到在控制檯上看到println。任何想法爲什麼? '的System.out。println(「未通過測試」);'在方法'should_fail'中?謝謝 –

+0

你可以在init()方法中看到添加了一個打印語句'System.out.println(「********* - IN INIT METHOD **********」)'。這應該始終執行。但我沒有在控制檯中看到。這些線在哪裏進行gradle構建? –

+0

您應該能夠在位於build/reports/tests/test/index.html中的測試報告中看到這一點。 –