Тестирование калитки - AnnotApplicationContextMock - к текущему потоку не присоединено приложение - PullRequest
0 голосов
/ 05 мая 2010

Я написал пару тестов для небольшого веб-приложения, но я получаю сообщение об ошибке, когда пытаюсь запустить тесты для конкретной страницы, использующие WicketTester.

Google отправляет меня в список рассылки Apache Wicket, где у пользователя возникло то же исключение. Он / она сказал, что проблема была в том, что AnnotApplicationContextMock был инициализирован до применения Wicket. Я также вставил свой класс 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 ]

1 голос
/ 05 мая 2010

Мне удалось это исправить, кажется, пользователь из списка рассылки Wicket был прав, я просто не мог понять это до сих пор.

Переместив инициализацию AnnotApplicationContextMock внутри метода getSpringComponentInjector WicketApplication, я смог запустить тесты.

    @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);
            }
        });
0 голосов
/ 14 октября 2015

дубль (Application application) на странице в пул потоков, в пул добавьте, если: if (! Application.exists ()) { ThreadContext.setApplication (приложение); }

...