У меня есть проблема, которую я не могу решить. Я искал в Интернете и в 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, у них одинаковый идентификатор.
Если я изменил область действия «сеанс» на область «приложение», она работает правильно.
Может кто-нибудь мне помочь?
спасибо.