Я пишу @WebMvcTest
модульные тесты для контроллера Spring Boot. Проблема: контроллер не получает атрибуты сеанса, переданные ему MockMvc.
Следующий тест не пройден, поскольку сессия контроллера всегда пуста:
@RunWith(SpringRunner.class)
@WebMvcTest(SessionController.class)
@AutoConfigureMockMvc
public class SessionControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetName() throws Exception {
mockMvc
.perform(get("/session/name")
.sessionAttr("name", "Smith"))
.andExpect(status().isOk())
.andExpect(content().string("Smith"));
}
}
Вот контроллер. При вызове из браузера конечная точка и сеанс / name работают правильно.
@RestController
@RequestMapping("/session")
public class SessionController {
@GetMapping("/name")
public String getName(HttpSession session) {
String name = (String)session.getAttribute("name");
return name;
}
}
Соответствующие зависимости gradle:
plugins {
id 'org.springframework.boot' version '2.1.7.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
sourceCompatibility = '11'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.session:spring-session-core'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
Поставщик сеанса просто ConcurrentHashMap
. Вот конфигурация:
@Configuration
@EnableWebMvc
@EnableSpringHttpSession
public class MyWebConfig implements WebMvcConfigurer {
@Profile({ "default", "dev" })
@Bean
public MapSessionRepository sessionRepository() {
return new MapSessionRepository(new ConcurrentHashMap<>());
}
}
Что я пропускаю / не понимаю? Спасибо!