2014-01-28 58 views
38

我有AA Java程序讀取系統屬性如何給系統屬性通過搖籃我的測試和-D

System.getProperty("cassandra.ip"); 

,我有一個搖籃構建文件,我開始

gradle test -Pcassandra.ip=192.168.33.13 

gradle test -Dcassandra.ip=192.168.33.13 

然而System.getProperty永遠換貨政... null

我發現的唯一辦法是通過補充說,在我的搖籃構建文件

test { 
    systemProperty "cassandra.ip", "192.168.33.13" 
} 

我如何通過-D

+1

當你使用'gradle這個-Dcassandra.ip = 192.168會發生什麼。 33.13'?無論如何,測試任務會分叉一個或幾個新的JVM。所以你必須明確地傳遞屬性。不過,沒有人強迫你在編譯版本中對自己的價值進行硬編碼。 –

+0

也看看這個答案:https://stackoverflow.com/questions/23689054/problems-passing-system-properties-and-parameters-when-running-java-class-via-gr/23689696#23689696 – IgalS

回答

43

-P標誌是gradle這個特性,以及這樣做 - D標誌用於JVM屬性。因爲測試可能會在新的JVM中分叉,所以傳遞給gradle的-D參數將不會傳播到測試中 - 聽起來這就是您所看到的行爲。

可以使用systemProperty在test塊,你已經做了,但通過它傳遞-P基於它傳入gradle這個屬性:

test { 
    systemProperty "cassandra.ip", project.getProperty("cassandra.ip") 
} 

或替代,如果你是在通過傳遞-D

test { 
    systemProperty "cassandra.ip", System.getProperty("cassandra.ip") 
} 
17

遇到了這個問題,除了我不想列出gradle腳本中命令行上給出的所有屬性。因此,我把所有的系統屬性,以我的測試

task integrationTest(type: Test) { 
    useTestNG() 
    options { 
     systemProperties(System.getProperties()) 
    } 
} 
4

我有地方,我需要通過系統屬性到測試JVM的情況下,但不是所有(不想在不相關的通) 。基於以上的答案,並通過使用subMap過濾我需要的,這個工作對我來說:

task integrationTest(type: Test) { 
    // ... Do stuff here ... 
    systemProperties System.getProperties().subMap(['PROP1', 'PROP2']) 
} 

在這個例子中,只有PROP1PROP2將被傳入,如果他們在gradle產出的JVM存在。

2

下面是一個將大量項目屬性作爲系統屬性傳遞給測試JVM的變體。我比項目屬性更喜歡系統屬性來增加靈活性。

task intTest(type: Test) { 
    systemProperties project.properties.subMap(["foo", "bar"]) 
} 

這可以在命令行傳遞:

$ gradle intTest -Pfoo=1 -Pbar=2 

並在測試中檢索:

String foo = System.getProperty("foo");