Wicket测试 - AnnotApplicationContextMock - 当前线程main没有附加应用程序

时间:2010-05-05 05:48:19

标签: java hibernate spring wicket

我为一个小型网络应用程序编写了几个测试,但是当我尝试运行使用WicketTester的页面特定测试时出现错误。

Google将我发送到Apache Wicket的邮件列表,其中用户遇到了相同的异常。他/她说问题是在Wicket应用程序之前初始化了AnnotApplicationContextMock。我也粘贴了我的WicketApplication类。

你们之前有没有处理过这个错误?我已经粘贴了例外和下面的课程。

例外:

-------------------------------------------------------------------------------
Test set: com.upbeat.shoutbox.web.TestViewShoutsPage
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 1.545 sec (AnnotApplicationContextMock.java:61)
    at com.upbeat.shoutbox.web.TestViewShoutsPage.setUp(TestViewShoutsPage.java:30)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:129)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:93)
    at org.unitils.UnitilsJUnit4TestClassRunner$CustomMethodRoadie.runBeforesThenTestThenAfters(UnitilsJUnit4TestClassRunner.java:168)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.unitils.UnitilsJUnit4TestClassRunner.invokeTestMethod(UnitilsJUnit4TestClassRunner.java:127)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:59)
    at org.unitils.UnitilsJUnit4TestClassRunner.access$000(UnitilsJUnit4TestClassRunner.java:42)
    at org.unitils.UnitilsJUnit4TestClassRunner$1.run(UnitilsJUnit4TestClassRunner.java:87)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.unitils.UnitilsJUnit4TestClassRunner.run(UnitilsJUnit4TestClassRunner.java:94)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)

我的页面特定测试类:

package com.upbeat.shoutbox.web;

import org.apache.wicket.application.IComponentInstantiationListener;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.spring.injection.annot.test.AnnotApplicationContextMock;
import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Test;
import org.unitils.spring.annotation.SpringBeanByType;

import com.upbeat.shoutbox.WicketApplication;
import com.upbeat.shoutbox.integrations.AbstractIntegrationTest;
import com.upbeat.shoutbox.persistence.ShoutItemDao;
import com.upbeat.shoutbox.services.ShoutService;
import com.upbeat.shoutbox.web.pages.ViewShoutsPage;

public class TestViewShoutsPage extends AbstractIntegrationTest {
    @SpringBeanByType
    private ShoutService svc;

    @SpringBeanByType
    private ShoutItemDao dao;

    protected WicketTester tester;

    @Before
    public void setUp() {
        final AnnotApplicationContextMock appctx = new AnnotApplicationContextMock();

        appctx.putBean("ShoutItemDao", dao);
        appctx.putBean("ShoutService", svc);

        tester = new WicketTester(new WicketApplication() {
            @Override
            protected IComponentInstantiationListener getSpringComponentInjector(WebApplication app) {
                return new SpringComponentInjector(app, appctx, false);
            }
        });
    }

    @Test
    public void testRenderPage() {
        tester.startPage(ViewShoutsPage.class);
        tester.assertRenderedPage(ViewShoutsPage.class);
        FormTester ft = tester.newFormTester("addShoutForm");
        ft.setValue("nickname", "test-nickname");
        ft.setValue("content", "a whole lot of content");
        ft.submit();
        tester.assertRenderedPage(ViewShoutsPage.class);
        tester.assertContains("test-nickname");
        tester.assertContains("a whole lot of content");    
    }
}

AbstractIntegrationTest:

package com.upbeat.shoutbox.integrations;

import org.springframework.context.ApplicationContext;
import org.unitils.UnitilsJUnit4;
import org.unitils.spring.annotation.SpringApplicationContext;

@SpringApplicationContext({"/com/upbeat/shoutbox/spring/applicationContext.xml", "applicationContext-test.xml"})
public abstract class AbstractIntegrationTest extends UnitilsJUnit4 {
    private ApplicationContext applicationContext;
}

WicketApplication:

package com.upbeat.shoutbox;

import org.apache.wicket.application.IComponentInstantiationListener;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.target.coding.IndexedParamUrlCodingStrategy;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;

import com.upbeat.shoutbox.web.pages.ParamPage;
import com.upbeat.shoutbox.web.pages.VeryNiceExceptionPage;

/**
 * Application object for your web application. If you want to run this application without deploying, run the Start class.
 * 
 * @see com.upbeat.shoutbox.Start#main(String[])
 */
public class WicketApplication extends WebApplication
{    
    /**
     * Constructor
     */
    public WicketApplication()
    {
    }

    /**
     * @see org.apache.wicket.Application#getHomePage()
     */
    public Class getHomePage()
    {
        return HomePage.class;
    }

    @Override
    protected void init() {
        super.init();

        // Enable wicket ajax debug
        getDebugSettings().setAjaxDebugModeEnabled(true);

        addComponentInstantiationListener(getSpringComponentInjector(this));
        // Mount pages
        mountBookmarkablePage("/home", HomePage.class);
        mountBookmarkablePage("/exceptionPage", VeryNiceExceptionPage.class);
        mount(new IndexedParamUrlCodingStrategy("/view_params", ParamPage.class));
    }

    protected IComponentInstantiationListener getSpringComponentInjector(WebApplication app) {
        return new SpringComponentInjector(app);
    }

}

2 个答案:

答案 0 :(得分:1)

我能够修复它,好像来自Wicket邮件列表的用户是对的,直到现在我才能做到这一点。

通过在WicketApplication getSpringComponentInjector-method中移动AnnotApplicationContextMock的初始化,我能够运行测试。

    @Before
    public void setUp() {
        tester = new WicketTester(new WicketApplication() {
            @Override
            protected IComponentInstantiationListener getSpringComponentInjector(WebApplication app) {
                AnnotApplicationContextMock appctx = new AnnotApplicationContextMock();
                appctx.putBean("shoutItemDao", dao);
                appctx.putBean("shoutService", svc);
                return new SpringComponentInjector(app, appctx, true);
            }
        });

答案 1 :(得分:0)

将页面中的{Application application)带到线程池,在池中添加if:     if(!Application.exists()){         ThreadContext.setApplication(应用程序);     }