首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打破匕首中的循环依赖

打破匕首中的循环依赖
EN

Stack Overflow用户
提问于 2015-07-23 01:50:48
回答 1查看 1.7K关注 0票数 4

我对匕首非常陌生--我甚至不知道它是否适用于我的申请。

我有一个搜索页面,返回有关某位名人的最新消息。

我已经写了一个测试,以验证当我们搜索一个受欢迎的名人时,结果会出现在页面上。

page有一个searchField,它在构造函数中需要page,这样用于测试的web驱动程序就可以选择它。

名人搜索页面测试

代码语言:javascript
复制
public class CelebritySearchPageTest {
    @Test
    public void testSearchResultsForKevinBaconVerifyHisPopularity() {
        CelebritySearchPage searchPage = new CelebritySearchPage();
        searchPage.searchFor("Kevin Bacon");
        Assert.assertTrue(searchPage.getNumberOfResults() > 9999999, "Verify that Kevin Bacon is still relevant");
    }
}

名人搜索页面

代码语言:javascript
复制
public class CelebritySearchPage extends Page {
    @Inject
    @Named("search field")
    TextField searchField;

    public void searchFor(String text) {
        searchField.setText(text);
        // ...
    }

    public int getNumberOfResults() {
        // ...
    }
}

名人搜索页面模块

代码语言:javascript
复制
@Module(injects = CelebritySearchPage.class)
public class CelebritySearchPageModule {
    @Provides
    @Named("search field")
    public TextField provideSearchField() {
        return new TextField(/* How do I get the page? */, "#searchField");
    }
}

页面

代码语言:javascript
复制
public abstract class Page {
    // ...
}

文本字段

代码语言:javascript
复制
public class TextField {
    protected Page page;
    protected String selector;

    public TextField(Page page, String selector) {
        this.page = page;
        this.selector = selector;
    }

    public void setText(String text) {
        // ...
    }
}

问题是page需要searchField,但是searchField需要page。如何克服这种循环依赖?

我无法在searchField中初始化CelebritySearchPage

EN

Stack Overflow用户

发布于 2015-07-28 20:23:31

考虑到这一点:

CelebritySearchPage

代码语言:javascript
复制
public class CelebritySearchPage extends Page {
    private final Lazy<TextField> searchField;
// always prefer constructor injection
// avoid @Named if possible, since the compiler cannot check the string
    @Inject
    CelebritySearchPage(@Named("search field") Lazy<TextField> searchField) {
        this.searchField = searchField; 
    }
}

文本字段

代码语言:javascript
复制
public class TextField {
    protected final Lazy<Page> page;
    protected final String selector;

    @Inject TextField(Lazy<Page> page, String selector) {
        this.page = page;
        this.selector = selector;
    }

/*
Lazy::get()
Return the underlying value, computing the value if necessary. All calls to      the same Lazy instance will return the same result.
*/
}

我想一个懒散的人也足够了。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31576897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档