Необязательные атрибуты в макросе, обертывающем задачу Java Ant - PullRequest
0 голосов
/ 24 февраля 2019

Задачи Ant, реализованные в Java, в отличие от макросов XML Ant, имеют особенность, заключающуюся в несколько отличном поведении для отсутствующих атрибутов.

В моем случае я пытаюсь обернуть <testng> Antзадача, реализованная на Java, с помощью макроса.В частности, я хотел бы раскрыть большинство функциональных возможностей, предлагаемых муравьиной задачей TestNG, с некоторыми незначительными изменениями.

Среди других подобных атрибутов timeOut кажется немного сложным для воспроизведения, поскольку его пропуск ведет себя иначе, чем указаниеи пустая строка.

Это упрощенная версия моего определения макроса:

<macrodef name="my-wrapper">
  <attribute name="timeOut" default=""/>
  <element name="nested-elements" optional="true" implicit="true"/>
  <sequential>
    <testng timeOut="@{timeOut}">
      <nested-elements/>
    </testng>
  </sequential>
</macrodef>

, что не удается, поскольку Ant пытается преобразовать значение в целое число:

Can't assign value '' to attribute timeout, reason: class java.lang.NumberFormatException with message 'For input string: ""'

Мне предложили использовать <augment>, что кажется решением этой проблемы.Тем не менее, я не понимаю, как это следует использовать:

<macrodef name="my-wrapper">
  <attribute name="timeOut" default=""/>
  <element name="nested-elements" optional="true" implicit="true"/>
  <sequential>
    <augment unless:blank="timeOut" id="invocation" timeOut="@{timeOut}"/>
    <testng id="invocation">
      <nested-elements/>
    </testng>
  </sequential>
</macrodef>

Выше не удается из-за прямой ссылки:

java.lang.IllegalStateException: Unknown reference "invocation"

Инвертирование порядка <testng> и <augment>на самом деле не работает, потому что задача <testng> начинает выполняться до того, как будет расширенной .

Мне нужен способ условного добавления атрибута XML к вызову задачи.Это возможно только при использовании синтаксиса Ant XML?

1 Ответ

0 голосов
/ 26 февраля 2019

В этой ситуации простейшим решением будет просто установить допустимое значение по умолчанию для timeOut.Он ожидает строку, которая может быть разрешена как целое число, поэтому попробуйте использовать -1, если вы не хотите, чтобы был максимальный тайм-аут.

<macrodef name="my-wrapper">
  <attribute name="timeOut" default="-1"/>
  <element name="nested-elements" optional="true" implicit="true"/>
  <sequential>
    <testng timeOut="@{timeOut}">
      <nested-elements/>
    </testng>
  </sequential>
</macrodef>
...