#spring-boot
#spring-boot
Вопрос:
Я пишу тесты для своего контроллера. В моем приложении каждый запрос проходит через фильтр, но с исключением для некоторых запросов:
@Component
//@Order(Ordered.LOWEST_PRECEDENCE-10)
public class FilterTokenValidator extends OncePerRequestFilter {
...
@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
String path = request.getServletPath();
return path.startsWith("/signup") || path.startsWith("/signin");
}
...
}
В стандартно запущенном приложении все работает отлично, но когда я запускаю тесты…
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = ControllerSign.class)
@ContextConfiguration(classes= ToucanApplication.class)
@AutoConfigureMockMvc
public class ControllerSignTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@MockBean
private ServiceSign serviceSign;
@Autowired
private ApplicationContext applicationContext;
@MockBean
private RepositoryNote repositoryNote;
@MockBean
private RepositoryUser repositoryUser;
@BeforeEach
void printApplicationContext() {
Arrays.stream(applicationContext.getBeanDefinitionNames())
.map(name -> applicationContext.getBean(name).getClass().getName())
.sorted()
.forEach(System.out::println);
}
@Test
public void createUser_valuesOK_statusOK() throws Exception {
//todo check out possibility of create object and call method in same expression
JwtUtil jwtUtil = new JwtUtil();
when(serviceSign.createUser(eq("user1"), eq("user1")))
.thenReturn(jwtUtil.generateToken(new EntityUser("user1", "user1")));
mockMvc.perform(
post("/signup")
.contentType("application/json")
.content(objectMapper.writeValueAsString(new DtoUsernamePassword("user1", "user1")))
).andExpect(status().isOk());
}
}
…filter не получает никакого пути (например, используя request.getServletPath() в методе doFilterInternal()), и все неправильно. Есть ли лучший способ сделать что-то вроде исключений в filter? Есть ли какая-то ошибка в моем тесте контроллера? Большое спасибо.
Комментарии:
1. Вам нужен путь n к пути сервлета. Используйте
getRequestUri
вместоgetServletPath
.2. Спасибо. Тест пройден. Это была следующая небольшая ошибка, такая как неправильный импорт…