在 java 中绕过接口中的无构造函数
Get around no constructor in interface, in java
所以,我想知道如何解决接口中不能有构造函数的问题?
我正在使用 JUnit 和 Selenium 进行测试自动化。我有一个基础测试 class,它有一个名为 getDriver(LoginPage loginPage)
的方法。此方法用于初始化网络驱动程序。 LoginPage 是一个具有登录方法的接口。问题是我所有的页面对象构造函数都采用网络驱动程序。 getDriver 方法初始化网络驱动程序。所以,我的问题是如何只用接口初始化这个方法中的页面对象?谢谢
public interface LoginPage {
public BasePage signIn(String user, String password);
}
//can't init LoginPage outside, since I need this method to init WebDriver
public static WebDriver getDriver(LoginPage loginPage)
{
if (WebDriverUtil.hasQuit()) {
log.debug("Creating new instance of driver");
BaseTest.init();
browser = region.getBrowser().getName();
driver = WebDriverUtil.initDriver(browser, baseURL);
wait = new WebDriverWait(driver, DEFAULT_TIMEOUT/1000 );
SeleniumUtil.waitForPageLoaded(driver,DEFAULT_TIMEOUT);
if(loginPage != null)
{
loginPage.signIn(user, pass);
}
}
return driver;
}
您可以当场创建匿名 class 或在不同的 class 中实现接口并实例化它。
尽管使用 Java 代码输入密码似乎不是一个好主意,尤其是当它采用 String
形式时
我最终使用反射来解决这个问题。
public static <T extends LoginPage> WebDriver getDriver(Class<T> loginClass)
{
if (WebDriverUtil.hasQuit()) {
log.debug("Creating new instance of driver");
BaseTest.init();
browser = region.getBrowser().getName();
driver = WebDriverUtil.initDriver(browser, baseURL);
wait = new WebDriverWait(driver, DEFAULT_TIMEOUT/1000 );
SeleniumUtil.waitForPageLoaded(driver,DEFAULT_TIMEOUT);
handleLogin(driver, loginClass);
}
return driver;
}
private static <T extends LoginPage> void handleLogin(WebDriver driver, Class<T> loginClass)
{
if(loginClass != null)
{
try {
Constructor<T> constructor = loginClass.getDeclaredConstructor(WebDriver.class);
try {
T loginObj = constructor.newInstance(driver);
loginObj.signIn(user, pass);
} catch (InstantiationException | IllegalAccessException
| IllegalArgumentException
| InvocationTargetException e) {
log.warn("Error instantiating object for class: " + loginClass.toString());
}
} catch (NoSuchMethodException e) {
log.warn("No constructor that takes WebDriver is present on class: " + loginClass.toString());
log.trace(e);
} catch (SecurityException e) {
log.warn("SecurityException present on class: " + loginClass.toString());
log.trace(e);
}
}
}
所以,我想知道如何解决接口中不能有构造函数的问题?
我正在使用 JUnit 和 Selenium 进行测试自动化。我有一个基础测试 class,它有一个名为 getDriver(LoginPage loginPage)
的方法。此方法用于初始化网络驱动程序。 LoginPage 是一个具有登录方法的接口。问题是我所有的页面对象构造函数都采用网络驱动程序。 getDriver 方法初始化网络驱动程序。所以,我的问题是如何只用接口初始化这个方法中的页面对象?谢谢
public interface LoginPage {
public BasePage signIn(String user, String password);
}
//can't init LoginPage outside, since I need this method to init WebDriver
public static WebDriver getDriver(LoginPage loginPage)
{
if (WebDriverUtil.hasQuit()) {
log.debug("Creating new instance of driver");
BaseTest.init();
browser = region.getBrowser().getName();
driver = WebDriverUtil.initDriver(browser, baseURL);
wait = new WebDriverWait(driver, DEFAULT_TIMEOUT/1000 );
SeleniumUtil.waitForPageLoaded(driver,DEFAULT_TIMEOUT);
if(loginPage != null)
{
loginPage.signIn(user, pass);
}
}
return driver;
}
您可以当场创建匿名 class 或在不同的 class 中实现接口并实例化它。
尽管使用 Java 代码输入密码似乎不是一个好主意,尤其是当它采用 String
我最终使用反射来解决这个问题。
public static <T extends LoginPage> WebDriver getDriver(Class<T> loginClass)
{
if (WebDriverUtil.hasQuit()) {
log.debug("Creating new instance of driver");
BaseTest.init();
browser = region.getBrowser().getName();
driver = WebDriverUtil.initDriver(browser, baseURL);
wait = new WebDriverWait(driver, DEFAULT_TIMEOUT/1000 );
SeleniumUtil.waitForPageLoaded(driver,DEFAULT_TIMEOUT);
handleLogin(driver, loginClass);
}
return driver;
}
private static <T extends LoginPage> void handleLogin(WebDriver driver, Class<T> loginClass)
{
if(loginClass != null)
{
try {
Constructor<T> constructor = loginClass.getDeclaredConstructor(WebDriver.class);
try {
T loginObj = constructor.newInstance(driver);
loginObj.signIn(user, pass);
} catch (InstantiationException | IllegalAccessException
| IllegalArgumentException
| InvocationTargetException e) {
log.warn("Error instantiating object for class: " + loginClass.toString());
}
} catch (NoSuchMethodException e) {
log.warn("No constructor that takes WebDriver is present on class: " + loginClass.toString());
log.trace(e);
} catch (SecurityException e) {
log.warn("SecurityException present on class: " + loginClass.toString());
log.trace(e);
}
}
}