【问题标题】:Easy way to spring inject classes instead of returning new弹簧注入类而不是返回新的简单方法
【发布时间】:2015-04-20 15:50:17
【问题描述】:

我目前正在使用 jbehave 和 spring 运行 selenium 测试。我的模式是故事文件>步骤文件>页面文件。

但是我认为我返回新页面文件的方式不是很干净,我相信这些页面可以通过 spring 注入但我需要帮助实现这一点。

我的豆子:

<bean id="driverProvider" class="org.jbehave.web.selenium.PropertyWebDriverProvider">
<bean>

<bean id="pageFactory"class="com.automation.pages.Pages
    <constructor-arg ref="driverProvider" />
</bean>

在我的页面类中:

public class Pages {

    private final WebDriverProvider webDriverProvider;

    public Pages(WebDriverProvider webDriverProvider) {
        this.webDriverProvider = webDriverProvider;
    }

    public HomePage newHomePage() {
        return new HomePage(webDriverProvider);
    }

    public ContactPage newContactPage() {
        return new ContactPage(webDriverProvider);
    }
}

还有我的 BasePage 类:

public class BasePage {

protected HomePage homePage;
protected ContactPage contactPage;

public BasePage(PageFactory pageFactory) {
        homePage = pageFactory.newHomePage();
        contactPage = pageFactory.newContactPage();
}

然后从我的 Steps 文件中我只是扩展 BasePage 以便我可以访问受保护的页面。

理想情况下,我希望消除对 pagefactory 和/或 basepage 的需求,让 Spring 努力工作。

【问题讨论】:

    标签: java spring selenium dependency-injection jbehave


    【解决方案1】:

    你可以使用spring进行方法注入。

    使你的基类抽象并添加一个抽象方法public abstract ContactPage newPhoneLandingPage()

    在您的 bean 配置中,将 &lt;lookup-method name="newPhoneLandingPage" bean="newPhoneLandingPage"&gt; 添加到您的 bean 中,其中 newPhoneLandingPage 是您的原型 bean。

    Spring 将连接代码,因此如果调用该方法,将返回一个新的 (prototype) 实例。

    【讨论】:

    • 无论我需要什么,我都设法在字段声明中使用@Autowired 注释。这意味着现在不需要 BasePage 和 PageFactory。但是,对于每个步骤和页面文件,我确实有很多 bean,并且我已经在某处阅读过有关 spring 中的自定义注释的信息。我想知道我是否可以利用它来注释每个类并减少我拥有的 bean?
    猜你喜欢
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多