Невозможно выполнить любой StrutsTestCase с помощью Struts2-Junit-Plugin, метод действия имеет значение null

Прежде всего извините, если я не объясню это достаточно четко, я постараюсь сделать все возможное. Недавно я перешел с C/C# на Java, и я немного перегружен.

Я работаю над проектом, который использует Struts2+Hibernate (я не использую Spring); Идея заключалась в том, чтобы использовать Struts2-JUnit-плагин для проверки действий.

Я безуспешно следовал учебному пособию по strut2-junit-plugin, и после долгих исследований и опробования всех возможных решений, опубликованных везде, я не смог найти подходящее.

"Проблемы" (потому что я не совсем уверен, является ли это проблемой или нет...) У меня есть то, что, когда я пытаюсь запустить StrutsTestCase, во время setUp:

super.setUp();
initServletMockObjects();
setupBeforeInitDispatcher();
dispatcher = initDispatcher(dispatcherInitParams);
setupAfterInitDispatcher(dispatcher);

При вызове dispatcher = initDispatcher(dispatcherInitParams) dispatcherInitParams имеет значение NULL и генерирует следующую трассировку стека:

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
ERROR CdiObjectFactory [findBeanManager]: Could not find BeanManager instance for any given JNDI key, giving up
ERROR CdiObjectFactory Struts2 CDI integration could not be initialized.
ERROR DefaultConversionPropertiesProcessor Conversion registration error
 java.lang.NullPointerException
    at org.apache.struts2.cdi.CdiObjectFactory.getInjectionTarget(CdiObjectFactory.java:175)
    at org.apache.struts2.cdi.CdiObjectFactory.buildBean(CdiObjectFactory.java:148)
    at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:177)
    at com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator.createTypeConverter(DefaultTypeConverterCreator.java:40)
    at com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor.loadConversionProperties(DefaultConversionPropertiesProcessor.java:86)
    at com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor.processRequired(DefaultConversionPropertiesProcessor.java:68)
    at com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor.init(DefaultConversionPropertiesProcessor.java:59)
    at com.opensymphony.xwork2.inject.InitializableFactory.create(InitializableFactory.java:45)
    at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:52)
    at com.opensymphony.xwork2.inject.ContainerBuilder$3.create(ContainerBuilder.java:118)
    at com.opensymphony.xwork2.inject.ContainerBuilder$8.call(ContainerBuilder.java:626)
    at com.opensymphony.xwork2.inject.ContainerBuilder$8.call(ContainerBuilder.java:623)
    at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:555)
    at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:623)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:187)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)
    at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:957)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:463)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:496)
    at org.apache.struts2.util.StrutsTestCaseHelper.initDispatcher(StrutsTestCaseHelper.java:44)
    at org.apache.struts2.StrutsTestCase.initDispatcher(StrutsTestCase.java:236)
    at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:216)
    at com.xxxx.xxxxx.xx.xxx.PasswordActionTest.setUp(PasswordActionTest.java:31)
    at junit.framework.TestCase.runBare(TestCase.java:139)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:129)
    at junit.framework.TestSuite.runTest(TestSuite.java:255)
    at junit.framework.TestSuite.run(TestSuite.java:250)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
ERROR DefaultConversionPropertiesProcessor Conversion registration error
 java.lang.NullPointerException
    at org.apache.struts2.cdi.CdiObjectFactory.getInjectionTarget(CdiObjectFactory.java:175)
    at org.apache.struts2.cdi.CdiObjectFactory.buildBean(CdiObjectFactory.java:148)
    at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:177)
    at com.opensymphony.xwork2.conversion.impl.DefaultTypeConverterCreator.createTypeConverter(DefaultTypeConverterCreator.java:40)
    at com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor.loadConversionProperties(DefaultConversionPropertiesProcessor.java:86)
    at com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor.process(DefaultConversionPropertiesProcessor.java:64)
    at com.opensymphony.xwork2.conversion.impl.DefaultConversionPropertiesProcessor.init(DefaultConversionPropertiesProcessor.java:60)
    at com.opensymphony.xwork2.inject.InitializableFactory.create(InitializableFactory.java:45)
    at com.opensymphony.xwork2.inject.Scope$2$1.create(Scope.java:52)
    at com.opensymphony.xwork2.inject.ContainerBuilder$3.create(ContainerBuilder.java:118)
    at com.opensymphony.xwork2.inject.ContainerBuilder$8.call(ContainerBuilder.java:626)
    at com.opensymphony.xwork2.inject.ContainerBuilder$8.call(ContainerBuilder.java:623)
    at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:555)
    at com.opensymphony.xwork2.inject.ContainerBuilder.create(ContainerBuilder.java:623)
    at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:187)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66)
    at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:957)
    at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:463)
    at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:496)
    at org.apache.struts2.util.StrutsTestCaseHelper.initDispatcher(StrutsTestCaseHelper.java:44)
    at org.apache.struts2.StrutsTestCase.initDispatcher(StrutsTestCase.java:236)
    at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:216)
    at com.xxx.xxxx.xxx.xxxx.PasswordActionTest.setUp(PasswordActionTest.java:31)
    at junit.framework.TestCase.runBare(TestCase.java:139)
    at junit.framework.TestResult$1.protect(TestResult.java:122)
    at junit.framework.TestResult.runProtected(TestResult.java:142)
    at junit.framework.TestResult.run(TestResult.java:125)
    at junit.framework.TestCase.run(TestCase.java:129)
    at junit.framework.TestSuite.runTest(TestSuite.java:255)
    at junit.framework.TestSuite.run(TestSuite.java:250)
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

После этого, даже если я получил ошибку, я могу продолжить тестирование, например, следующего теста:

@Test
public void testGetActionProxy() throws Exception {

    //set parameters before calling getActionProxy
    PasswordUpdate pu = new PasswordUpdate();
    pu.setCurrentPassword("current");
    pu.setNewPassword("new");
    pu.setNewPasswordConfirm("new");
    request.setParameter("passwordUpdate.currentPassword", pu.getCurrentPassword());
    request.setParameter("passwordUpdate.newPassword", pu.getNewPassword());
    request.setParameter("passwordUpdate.newPasswordConfirm", pu.getNewPasswordConfirm());

    ActionProxy proxy = getActionProxy("/UpdatePassword.action");
    assertNotNull(proxy);

    PasswordAction action = (PasswordAction) proxy.getAction();
    assertNotNull(action);

    String result = proxy.execute();
    assertEquals(Action.SUCCESS, result);
    assertNotNull(action.getPasswordUpdate());
    assertEquals("current", action.getPasswordUpdate().getCurrentPassword());
    assertEquals("new", action.getPasswordUpdate().getNewPassword());
    assertEquals("new", action.getPasswordUpdate().getNewPasswordConfirm());

}

Вторая проблема заключается в том, что он не находит действия при вызове:

ActionProxy proxy = getActionProxy ("/ UpdatePassword.action");

Это вызывает исключение внутри getActionProxy:

protected ActionProxy getActionProxy(String uri) {
        request.setRequestURI(uri);
        ActionMapping mapping = getActionMapping(request);
        String namespace = mapping.getNamespace();
        String name = mapping.getName();
        String method = mapping.getMethod();

        Configuration config = configurationManager.getConfiguration();
        ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
                namespace, name, method, new HashMap<String, Object>(), true, false);

        initActionContext(proxy.getInvocation().getInvocationContext());

        // this is normally done in onSetUp(), but we are using Struts internal
        // objects (proxy and action invocation)
        // so we have to hack around so it works
        ServletActionContext.setServletContext(servletContext);
        ServletActionContext.setRequest(request);
        ServletActionContext.setResponse(response);

        return proxy;
    }

На этом этапе метод String имеет значение null, и следующий вызов вызывает исключение:

ActionProxy proxy = config.getContainer (). GetInstance(ActionProxyFactory.class).createActionProxy(пространство имен, имя, метод, новый HashMap(), true, false);

Есть идеи, прежде чем я сдаюсь?

Спасибо!

1 ответ

Решение

В случае, если кто-то еще попадает в этот пост с той же проблемой

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
ERROR CdiObjectFactory [findBeanManager]: Could not find BeanManager instance for any given JNDI key, giving up
ERROR CdiObjectFactory Struts2 CDI integration could not be initialized.
ERROR DefaultConversionPropertiesProcessor Conversion registration error

Вы можете исправить это, исключив из вашей конфигурации struts2-cdi-plugin

Другие вопросы по тегам