2015-08-06 1 views
2

У меня есть проблема, которую я не могу решить. Я искал в Интернете и в Stackoverflow, но не смог найти решение этой проблемы.Проверка перехватчика обработчика Spring MVC с зависящей от сеанса связью бобов

Я хочу проверить перехватчик манипулятора Spring MVC. Этот перехватчик имеет «область действия сеанса» как зависимость.

Я старался как можно меньше уменьшить код. Вот код:

СРК часть:

@EnableWebMvc 
@Configuration 
@ComponentScan(basePackages = { "..." }) 
public class SpringMvcConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addInterceptors(InterceptorRegistry interceptorRegistry) { 
     interceptorRegistry.addInterceptor(initializeUserLanguageHandler()); 
    } 

    @Bean 
    public InitializeUserLanguageHandler initializeUserLanguageHandler() { 
     return new InitializeUserLanguageHandler(); 
    } 

    @Bean 
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
    public SessionBean sessionBean() { 
     return new SessionBean(); 
    } 
} 


@Component 
public class InitializeUserLanguageHandler extends AbstractHandlerInterceptor { 

    @Autowired 
    private SessionBean sessionBean; 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     if (sessionBean.getLanguage() == null) { 
      sessionBean.setLanguage(getUserLanguage()); 
     } 

     return true; 
    } 
} 

Тест часть:

@WebAppConfiguration 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = SpringMvcConfiguration.class) 
public class BaseSpringMvcIntegrationTest { 

    @Resource 
    protected WebApplicationContext webApplicationContext; 

    protected MockMvc mockMvc; 

    @Before 
    public void setUp() { 
     mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    } 
} 

public class InitializeUserLanguageHandlerTest extends BaseSpringMvcIntegrationTest { 

    @Autowired 
    private SessionBean sessionBean; 

    @Autowired 
    private MockHttpSession mockHttpSession; 

    @Test 
    public void testLanguageIsInitializedOnlyOnce() throws Exception { 
     MockHttpSession mocksession = new MockHttpSession(); 

     // It is null, this is because the interceptor has not been called yet 
     assertEquals(null, sessionBean.getLanguage()); 

     // This line will call the interceptor and set language to "nl" 
     mockMvc.perform(get("/").session(mocksession).principal(getUser("nl"))); 

     // It is null, but I expect it to be "nl" 
     assertEquals(null, sessionBean.getLanguage()); 

     // Let's try again  
     mockMvc.perform(get("/").session(mocksession).principal(getUser("fr"))); 

     // It is null, but I expect it to be "nl" 
     assertEquals(null, sessionBean.getLanguage()); 
    } 
} 

Вы можете увидеть в тестовом классе "InitializeUserLanguageHandlerTest", что у меня есть несколько утверждений.

Первый раз, когда я называю:

mockMvc.perform(get("/").session(mocksession).principal(getUser())); 

Код в перехватчика выполняется и язык установлен на «п». Поэтому в моем тесте я ожидал, что sessionBean.getLanguage() вернет мне «nl», но это не так. Я не понимаю, почему.

Так что я снова вызываю выполнение, код перехватчика выполняется снова, а вызов sessionBean.getLanguage() возвращает «nl».

Кажется, у меня есть два экземпляра SessionBean, один в моем тесте, а другой в источнике. Но когда я смотрю на переменную SessionBean в Eclipse в режиме Debug, у них одинаковый идентификатор.

Если я изменил область действия «сеанс» на область «приложение», она работает правильно.

Может кто-нибудь мне помочь?

спасибо.

ответ

0

Вот один из способов решения проблемы, но не уверен, что это самое лучшее.

@ContextConfiguration(classes = {SpringMvcConfiguration.class, InitializeUserLanguageHandlerTest.BeanConfig.class}) 
public class InitializeUserLanguageHandlerTest extends BaseSpringMvcIntegrationTest { 

    @Configuration 
    public static class BeanConfig { 
     @Bean(name = "sessionBean") 
     public SessionBean sessionBean() { 
      return new SessionBean(); 
     } 
    } 
    ... 
} 
Смежные вопросы