«Явный» тип в Java - это класс, который является неэквивалентным и имеет дело с «сырыми» объектами, а не с типичными типами типовых параметров.
Например, до того, как были доступны дженерики Java , вы должны использовать класс коллекции следующим образом:
LinkedList list = new LinkedList();
list.add(new MyObject());
MyObject myObject = (MyObject)list.get(0);
Когда вы добавляете свой объект в список, ему все равно, какой тип объекта он есть, и когда вы его получите из списка, вам нужно явно указать его на тот тип, который вы ожидаете.
Используя generics, вы удаляете «неизвестный» коэффициент, потому что вы должны явно указать, какой тип объектов может идти в списке:
LinkedList<MyObject> list = new LinkedList<MyObject>();
list.add(new MyObject());
MyObject myObject = list.get(0);
Обратите внимание, что с помощью дженериков вам не нужно бросать объект, исходящий из вызова get, сбор предварительно задан для работы с MyObject. Этот факт является основным движущим фактором для генериков. Он меняет источник ошибок времени выполнения во что-то, что можно проверить во время компиляции.
Флаг -P предназначен для свойств градиента, а флаг -D предназначен для свойств JVM. Поскольку тест может быть разветвлен в новой JVM, аргумент -D, переданный в gradle, не будет распространяться на тест - похоже, что это поведение, которое вы видите.
Вы можете использовать systemProperty в ваш блок test
, как вы это делали, но основывайте его на свойстве входящего градиента, передавая его с ним -P:
test {
systemProperty "cassandra.ip", project.getProperty("cassandra.ip")
}
или, альтернативно, если вы передаете его через -D
test {
systemProperty "cassandra.ip", System.getProperty("cassandra.ip")
}
У меня был случай, когда мне нужно было передать свойства системы multiple в тестовый JVM, но не все (не хотели пропускать нерелевантные). Основываясь на приведенных выше ответах и используя subMap
для фильтрации тех, которые мне нужны, это сработало для меня:
task integrationTest(type: Test) {
// ... Do stuff here ...
systemProperties System.getProperties().subMap(['PROP1', 'PROP2'])
}
В этом примере только PROP1
и PROP2
будут переданы в , если они существуют в JVM градильни.
Вот вариант, который передает множество свойств проекта тестовому JVM в качестве системных свойств. Я предпочитаю свойства проекта над свойствами системы, чтобы повысить гибкость.
task intTest(type: Test) {
systemProperties project.properties.subMap(["foo", "bar"])
}
Который может передаваться в командной строке:
$ gradle intTest -Pfoo=1 -Pbar=2
И получен в вашем тесте:
String foo = System.getProperty("foo");
System.getProperty("someprop")
с использованием этого метода подмары я получил {someprop=foo}
вместо foo
. Мне пришлось использовать systemProperty "foo", project.properties.subMap(["foo"]).get("foo")
в build.gradle
– Yngvar Kristiansen
31 July 2018 в 14:29
Пришел к этой очень большой проблеме, за исключением того, что я не хочу снова перечислять все свойства, указанные в командной строке в сценарии градации. Поэтому я отправляю все свойства системы в свой тест
task integrationTest(type: Test) {
useTestNG()
options {
systemProperties(System.getProperties())
}
}
System.getProperties().stringPropertyNames().forEach(System.out::println);
в Java-коде, оно не появляется) – CLOVIS 9 July 2018 в 20:09getProperty
выбрасываетMissingPropertyException
, если свойство не найдено. Вместо этого используйте ответ Eron: stackoverflow.com/a/43112126/915441 – Yngvar Kristiansen 31 July 2018 в 11:52