2014-01-28 3 views
38

У меня есть аа Java программу, которая считывает свойство системыКак дать системное свойство для моего теста через Gradle и -D

System.getProperty("cassandra.ip"); 

и у меня есть Gradle построить файл, который я начала с

gradle test -Pcassandra.ip=192.168.33.13 

или

gradle test -Dcassandra.ip=192.168.33.13 

однако System.getProperty всегда RETU rn null.

Единственный способ я нашел, чтобы добавить, что в моем Gradle построить файл через

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, аргумент -D, переданный в gradle, не будет распространяться на тест - похоже, что это поведение, которое вы видите.

Вы можете использовать SystemProperty в вашем test блоке, как вы сделали, но ее на основе поступающей Gradle имущества, передавая его с ним -P:

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

или в качестве альтернативы, если вы передаете его в с помощью -Д

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

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

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

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

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

В этом примере только PROP1 и PROP2 будут переданы в, если они существуют в JVM Gradle в.

2

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

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

, которые могут быть переданы в командной строке:

$ gradle intTest -Pfoo=1 -Pbar=2 

и извлекаться в тесте:

String foo = System.getProperty("foo"); 
Смежные вопросы