Spring: тесты JUnit с областью действия сеанса: неудовлетворенная зависимость выражается через поле 'sessionTestBean' - PullRequest
0 голосов
/ 18 февраля 2019

Я пытался следовать рекомендациям на https://tarunsapra.wordpress.com/2011/06/28/junit-spring-session-and-request-scope-beans/ или https://touk.pl/blog/2011/04/15/how-to-test-spring-session-scoped-beans/.Тем не менее, я не могу получить мои сессионные компоненты автоматически подключенными в тесте JUnit4.

Возможно, это просто какая-то глупая ошибка, однако я не могу ее найти.

Я использую spring-test 4.3.22.RELEASE(вместе с различными другими библиотеками Spring) и junit-4.12.jar

Вот мой тривиальный пример (проверено в Eclipse Oxygen.3a Release (4.7.3a))

TrivialSessionTest.java

package demo;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring/trivialApplicationContextForSessions.xml" })
@ComponentScan("demo")
public class TrivialSessionTests  {

@Autowired
protected SessionTestBean sessionTestBean;

@Test
public void testLogin() {
    Assert.assertEquals("Hello World", sessionTestBean.getSomething());
}

}

SessionTestBean.java

package demo;

import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;

@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class SessionTestBean {

public SessionTestBean() {}

public String getSomething() {
    return "Hello World";
}
}

spring / trivialApplicationContextForSessions.xml

<?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

<bean id="sessionScopeConfigurer" class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="session">
                <bean class="org.springframework.context.support.SimpleThreadScope" />
            </entry>
            <entry key="request">
                <bean class="org.springframework.web.context.request.RequestScope" />
            </entry>
        </map>
    </property>
</bean>
</beans>

Запуск результатов теста в

[main] ERROR org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener     [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@73e132e0] to prepare test instance [demo.TrivialSessionTests@3773862a]
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demo.TrivialSessionTests': Unsatisfied dependency expressed through field 'sessionTestBean'; nested exception is     org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'demo.SessionTestBean' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

1 Ответ

0 голосов
/ 18 февраля 2019

Извините, после интенсивных дальнейших испытаний я, наконец, обнаружил проблемы:

  1. Мне потребовалась дополнительная @ org.springframework.test.context.web.WebAppConfiguration для теста.Эта конфигурация также заботится о масштабировании сеанса.
  2. @ ComponentScan ("demo"), похоже, не работает в тестовом классе.Мне пришлось поместить его в ... applicationContext.xml
  3. Наконец: объявление области сеанса в по-видимому, не является необходимым (и proxyMode = ScopedProxyMode.TARGET_CLASS тоже)

Таким образом, рабочий пример выглядит следующим образом:

TrivialSessionTests.java

package demo;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

@org.junit.runner.RunWith(org.springframework.test.context.junit4.SpringJUnit4ClassRunner.class)
@org.springframework.test.context.ContextConfiguration(locations = { "classpath:spring/trivialApplicationContextForSessions.xml" })
@org.springframework.test.context.web.WebAppConfiguration
public class TrivialSessionTests {

    @Autowired()
    protected SessionTestBean sessionTestBean;

    @Test
    public void testLogin() {
    Assert.assertEquals("Hello World", sessionTestBean.getSomething());
    }
}

SessionTestBean.java

package demo;

import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;

@Component(value="sessionTestBean")
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class SessionTestBean {

    public SessionTestBean() {}

    public String getSomething() {
        return "Hello World";
    }
}

trivialApplicationContextForSessions.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

     <context:component-scan base-package="demo" />
</beans>
...