2016-11-16 5 views
1

Ниже двух методов, которые я хотел бы извлечь из общих методов, проблема заключается в том, что aisleID в одном из них является необязательным - это любой способ поставить необязательный аргумент в java-метод?Необязательный параметр Java в аргументе для аналогичных методов

private void putPageUnderAisleId(String aisleId) { 
     given() 
       .spec(prepareApplicationJsonHeaders()) 
       .header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING)) 
       .body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION)) 
       .put(AISLE_HTML_URL, aisleId) 
       .then() 
       .statusCode(200) 
       .body(not(isEmptyOrNullString())) 
       .body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString())); 
    } 

    private void putPageUnderRootAisleId() { 
     given() 
       .spec(prepareApplicationJsonHeaders()) 
       .header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING)) 
       .body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION)) 
       .put(ROOT_AISLE_HTML_URL) 
       .then() 
       .statusCode(200) 
       .body(not(isEmptyOrNullString())) 
       .body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString())); 
    } 
+0

Извлечь третий способ, которым вы передаете лямбду, которая выполняет 'put' часть. Вы вызываете лямбду на объект-строитель на соответствующем шаге, а затем выполняете остальные шаги. –

+0

не могли бы вы предоставить готовый пример ...? – Michal

+0

'void putPage (Потребитель c) {Builder b = given(). Spec (...) ...; c.accept (б); . B.then() StatusCode (...) ...; } 'Invoke with' putPage (b -> b.put (AISLE_HTML_URL, aisleId); 'и' putPage (b -> b.put (ROOT_AISLE_HTML_ID) '. –

ответ

1

Почему не что-то вроде этого?

private void putPageUnderRootAisleId() { 
    return putPageUnderAisleId(null); 
} 

private void putPageUnderAisleId(String aisleId) { 
    Object putKey = aisleId != null ? AISLE_HTML_URL : ROOT_AISLE_HTML_URL; 
    given() 
      .spec(prepareApplicationJsonHeaders()) 
      .header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING)) 
      .body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION)) 
      .put(putKey, aisleId) 
      .then() 
      .statusCode(200) 
      .body(not(isEmptyOrNullString())) 
      .body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString())); 
} 

Хорошая часть этого подхода является то, что вы только поддерживать один метод. Я определил putKey как Object, потому что я не знаю, какую библиотеку вы используете. Единственная другая часть между обоими методами - это часть put(). Просто проверьте реализацию метода put. 99% уверены, что один с одним аргументом вызывает тот, у которого 2, а второй - значением по умолчанию. Если этот аргумент по умолчанию равен нулю, вы готовы пойти с моим. Если она отличается от нуля, то у вас есть только сделать ассигнование, как это aisleId:

aisleId != null ? aisleId : %defaultValue; 

быть % DefaultValue значения по умолчанию метод путы используют по реализации на один аргумент.

Как указано на @AxelH, если положить получает с переменным числом аргументов, подход выше является рискованным (и, вероятно, не правильно), так что в этом случае вы должны создать объект [], чтобы обеспечить эти аргументы:

private void putPageUnderRootAisleId() { 
    return putPageUnderAisleId(null); 
} 

private void putPageUnderAisleId(String aisleId) { 
    Object putKey = aisleId != null ? AISLE_HTML_URL : ROOT_AISLE_HTML_URL; 
    Object[] putArgs = aisleId != null ? new Object[]{aisleId} : new Object[]{}; 

    given() 
      .spec(prepareApplicationJsonHeaders()) 
      .header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING)) 
      .body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION)) 
      .put(putKey, putArgs) 
      .then() 
      .statusCode(200) 
      .body(not(isEmptyOrNullString())) 
      .body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString())); 
} 
+0

Вы уверены, что знаете поведение или метод 'put()', чтобы при условии, что значение по умолчанию ничего не сломает? –

+1

Структура хорошая, но реализация рискованна, уверены ли вы, что передача значения «null» совпадает с тем, что ничего не прошло? если это параметры varargs, число параметров может быть важным, это необходимо указать;) – AxelH

+0

Вам нужно 'Builder b = given(). spec (...). header (...). body (. ..); b = aisleId! = null? b.put (AISLE_HTML_URL, aisleId): b.put (AISLE_ROOT_HTML_URL); b.then(). statusCode ... ' –

3

Там может быть sleaker способ обработки этого с Java 8 лямбда-выражений, но вы можете выставить putPageUnderAisleId(String aisleId), и когда вход null, то вы бы рассматривать его как параметр не передается. Что-то вроде этого:

private void putPageUnderAisleId(String aisleId) { 
    RequestSpecification instance = given() 
      .spec(prepareApplicationJsonHeaders()) 
      .header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING)) 
      .body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION)); 

    if (aisleId != null) { 
     instance.put(AISLE_HTML_URL, aisleId) 
    } else { 
     instance.put(ROOT_AISLE_HTML_URL) 
    } 

    instance.then() 
      .statusCode(200) 
      .body(not(isEmptyOrNullString())) 
      .body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString())); 
} 
+1

По крайней мере, вы могли сначала сделать 'given() ... body (...)', затем ifology _just_ для вызова 'put()', затем продолжить по общему пути с помощью 'then() ...'. –

+0

Да, но что на самом деле возвращает 'put()'? –

+0

Совершенно очевидно, что он возвращает 'this'. –

2

К сожалению, вы не можете сделать это на Java.

Вам нужно будет объявить оба метода, но вы можете, например, в private void putPageUnderRootAisleId() позвонить только private void putPageUnderAisleId(null) и просто обработать нулевой регистр.

Это обсуждение дает больше информации о вашей проблеме: Java optional parameters

+0

Вы можете сделать это, используя перегрузку. Это не будет написано как C++ или другой язык с использованием значения по умолчанию, но использование будет одинаковым. – AxelH

+0

Это именно то, что я имел в виду, перегрузка и вызов otherMethod (null) – Davezedave

+0

Я понял, даже если вы не объясните это правильным термином. Но, пожалуйста, удалите эту первую строку или замените ее на **, вы не можете сделать это одним способом в Java **;) – AxelH

1

Вы можете попробовать с перегрузкой метода. Предполагая, что метод put принимает нули aisleId, вы можете попробовать следующее.

private void putPageUnderAisleId(String aisleId) { 
      url=(aisleId!=null)?AISLE_HTML_URL:ROOT_AISLE_HTML_URL; 

      given() 
      .spec(prepareApplicationJsonHeaders()) 
      .header(HttpHeaders.AUTHORIZATION, verifiableToken(Roles.WRITE_MERCHANDISING)) 
      .body(readResource(NAMED_PAGE_CONTENT_FILE, String.format("%s.html", TEST_PAGE.value()), AISLE_TEST_LOCATION)) 
      .put(url, aisleId) 
      .then() 
      .statusCode(200) 
      .body(not(isEmptyOrNullString())) 
      .body(JSON_RESPONSE_MESSAGE, not(isEmptyOrNullString())); 
} 

private void putPageUnderRootAisleId() { 

       putPageUnderAisleId(null); 
} 

Существует несколько способов обработки необязательных параметров, см. Этот ответ.

Java optional parameters

+0

Опять же, вы уверены, что можете передать нулевое значение без риска? – AxelH

+0

Это зависит от API, конечно. Какой API это? Обычно этот метод достаточно безопасен, но он работает как принцип. Знаете ли вы, какой API это? – Massimo

+0

'Обычно этот метод достаточно безопасен', как вы могли предположить это? Поскольку это называется 'put', я бы предположил, что это добавит значения в список, карту, массив ..., чтобы сгенерировать список параметров. Поэтому, возможно, он будет вставлять каждый параметр в список. Это означает, что вы вставляете «null» здесь в параметр секунд. Поскольку ОП не вставлял нуль в свой пример, ваше предположение неверно до некоторого доказательства;) – AxelH

0

Вы рассматривали новый дополнительный контейнер Java 8 как параметр?

Смежные вопросы