在 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);
        }
    }
}