如何使用wicket进行单元测试时如何设置自定义会话?

时间:2010-03-16 17:53:44

标签: apache unit-testing junit wicket

我正在尝试在wicket页面上运行一些单元测试,只有在你登录后才允许访问。在我的JUnit测试中,我无法启动页面或在没有设置会话的情况下渲染它。

如何设置会话?我在查找有关如何执行此操作的任何文档时遇到了问题。

    WicketTester tester = new WicketTester(new MyApp());
((MyCustomSession)tester.getWicketSession()).setItem(MyFactory.getItem("abc"));

//Fails to start below, no session seems to be set
    tester.startPage(General.class);
tester.assertRenderedPage(General.class);

3 个答案:

答案 0 :(得分:4)

我经常做的是提供一个虚假的WebApplication,覆盖我要模拟或存根的内容。

我覆盖的是方法

    public abstract Session newSession(Request request, Response response);

允许您使用您想要的任何内容返回假会话设置。

这是在Wicket 1.3中 - 如果您使用1.4,其中一些可能已经改变,并且如另一个响应中所述,它可能与一个检票口错误有关。

但假设界面没有太大变化,覆盖此方法也可能是解决WICKET-1215问题的另一种方法。

答案 1 :(得分:1)

您可能遇到WICKET-1215。否则你正在做的事情看起来很好。例如,我有一个Junit4设置方法,如下所示:

@Before
public void createTester() {
    tester = new WicketTester( new MyApp() );
    // see http://issues.apache.org/jira/browse/WICKET-1215
    tester.setupRequestAndResponse();
    MyAppSession session = (MyAppSession) tester.getWicketSession();
    session.setLocale(Locale.CANADA);
    session.setUser(...);
}

答案 2 :(得分:1)

使用Wicket 1.4,我使用我的常规WebApplication和WebSession实现,在我的应用程序中称为NewtEditor和NewtSession。我覆盖了newSession,除了我立即登录之外,我在常规应用程序代码中执行相同操作。我还因性能原因覆盖了newSessionStore,我从WicketTesters代码中复制了这个技巧。

tester = new WicketTester(new NewtEditor() 
{
    @Override
    public Session newSession(Request request, Response response)
    {
        NewtSession session = new NewtSession(request);
        session.signIn(getTestDao());
        return session;
    }

    @Override
    protected ISessionStore newSessionStore()
    {
        // Copied from WicketTester: Don't use a filestore, or we spawn lots of threads,
        // which makes things slow.
        return new HttpSessionStore(this);
    }
});