2017-02-23 140 views
0

У меня есть метод addNewUser, который запрашивает пользователей Имя пользователя, адрес электронной почты и пароль. Они будут храниться в листе excel на соответствующих столбцах. Пожалуйста, смотрите код ниже:JAVA: Добавить новый параметр в метод

public class ExcelConfig { 



public FileInputStream fis; 
public FileOutputStream fos; 
public XSSFWorkbook wb; 
public XSSFSheet sh; 
public XSSFRow row; 
public XSSFCell cell; 

int lastRow = 0; 

ConfigReader cr = new ConfigReader(); 

public ExcelConfig(){ 

     try { 
     fis = new FileInputStream(cr.getExcelPath()); 
     wb = new XSSFWorkbook(fis); 
     } 
     catch (Exception e) { 
     System.out.println("Error at ExcelConfig " + e.getMessage()); 
     } 


} 


public void addNewUser(String un, String em, String pw){ 


     cell = row.createCell(0); 
     cell.setCellValue(un); 

     cell = row.createCell(1); 
     cell.setCellValue(em); 

     cell = row.createCell(2); 
     cell.setCellValue(pw); 


} 

}

Теперь, в другом классе, я назвал метод addNewuser. См. Код ниже

public class NextStepTest { 

WebDriver driver; 

ConfigReader cf; 
ExcelConfig ec; 
UserDetails ud; 

LandingPage lp; 
RegisterPage rp; 

String username; 
String email; 
String password; 




@BeforeTest 
public void setUp(){ 
    cf = new ConfigReader(); 
    ec = new ExcelConfig(); 
    ud = new UserDetails(); 


    driver = cf.getChromeDriver(); 
    driver.get(cf.getAppUrl()); 


} 

@Test 
public void register(){ 

    username = cf.getUsernameFromProperty(); 
    email = cf.getEmailFromProperty(); 
    password = ud.getPassword(); 

    try{ 

     lp = new LandingPage(driver); 
     lp = PageFactory.initElements(driver, LandingPage.class); 

     lp.locateRegisterLink(); 
     lp.clickRegisterLink(); 

     rp = new RegisterPage(driver); 
     rp = PageFactory.initElements(driver, RegisterPage.class); 


     rp.locateUsernameField(); 
     rp.registerAccount(username, email, password); 


     ec.getSheet(0); 
     ec.getNextRow(); 
     ec.addNewUser(username, email, password); // here I call addNewUser method that now has username, email and password values 
     ec.closeFile(); 

     rp.logout(); 
     lp.locateLoginLink(); 



    } 
    catch(Exception e){ 
     System.out.println("Error under NextStepTest.java => " + e.getMessage()); 

    } 



} 

Теперь, что я хочу спросить, так это то, что можно сделать динамические параметры метода addNewUser? Я знаю, что этот сценарий зависит от проекта. В некоторых случаях проект может требовать добавления только имени пользователя, электронной почты и пароля в excel. Что делать, если в другом будущем проекте потребуется добавить тип учетной записи? Таким образом, параметры теперь станут 4. Или другим проектам потребуется только электронная почта и пароль. Должен ли я каждый раз обновлять параметры метода addNewUser? Я все еще стартер на этом языке. Любая помощь поможет. Всем спасибо!

+0

Позвольте вашему методу принять vararg: String ... args. И, пожалуйста, изучите Java немного. –

+0

@EgorZhuk Бит будет недостаточно ..: D – nobalG

+0

Возможно, ваш 'addNewUser' должен принять какой-то объект NewUserParameters.Вы можете создать такой объект с любыми параметрами, которые вам нужны в данном контексте, а затем передать его вашему методу. См. Также [шаблон построителя] (https://en.wikipedia.org/wiki/Builder_pattern) – khelwood

ответ

0

Вы можете создать интерфейс AddNewUser, который имеет метод createUser, который возвращает, например, созданную строку XSSFRow.

Затем вы создаете реализацию этого интерфейса, например. AddUserWithEmail, который получает определенные значения в конструкторе, а затем в методе createUser добавляет пользователя и электронную почту в строку.

Если у вас есть другой клиент, которому нужны разные значения в таблице, вы просто создаете новый вариант интерфейса AddNewUser и используете его вместо этого.

0

Что делать, если в другом будущем проекте, это потребует, чтобы добавить тип счета?

, то в будущем вам нужно будет перегрузить метод

public void addNewUser(String un, String em, String pw){ 

} 

//only username 
public void addNewUser(String un){ 

} 

//with all the info + token 
public void addNewUser(String un, String em, String pw, String token){ 

} 

единственное, что вам нужно знать, это: те все строки ... так что вы должны знать, что переда строка - это параметр ...

0

Да, это возможно. С помощью Тхи переменной параметра аргументы:

public void foo(String... strings){ 
    // method body 
} 

так с этой функции вы можете позвонить:

foo("name"); 
foo("name", "account"); 
foo("name", "account", "age"); 

и т.д ...

И usings эти аргументы, как это:

public void foo(String... strings) { 
     if (0 < strings.length()) { 
      String name = strings[0]; 
     } 
     if (1 < strings.length()) { 
      String account = strings[1]; 
     } 
     if (2 < strings.length()) { 
      String account = strings[2]; 
     } 
     // etc 
    } 

Надеюсь, это поможет.

1

Вы можете использовать карту в качестве параметра. Это поможет вам динамически передавать параметр.

public void addNewUser(Map<String, Object> mapInput){ 
    Iterator entries = mapInput.entrySet().iterator(); 
    int i=0; 
    while (entries.hasNext()) { 
     Entry thisEntry = (Entry) entries.next(); 
     String value = (String)thisEntry.getValue(); 
     cell = row.createCell(i); 
     cell.setCellValue(value); 
     i++; 
    } 
} 
Смежные вопросы