Как проверить контроллер с пользовательским тестовым перехватчиком при загрузке? - PullRequest
0 голосов
/ 26 июня 2019

Прежде всего, моя грамматика ужасна, потому что я плохо разбираюсь в английском.

Я попытался проверить контроллер, но произошла ошибка.

NoSuchBeanDefinitionException: No qualifying bean of type 'com.ccstudy.qna.interceptor.LoginSessionCheckInterceptor' available: expected at least 1 bean which qualifies as autowire candidate.

Я сделал перехватчик и цель перехватчика - сравнить переменную пути с идентификатором сессии.

Я сделал 1 интерфейс и 2класс

public interface LoginSessionCheckInterceptor extends HandlerInterceptor {
}
@Profile("prod")
@Component
@Slf4j
public class LoginSessionCheckInterceptorImpl implements LoginSessionCheckInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        AccountSessionDto accountSessionDto = (AccountSessionDto) request.getSession()
                .getAttribute(AccountSessionDto.ATTRIBUTE_NAME);
        Long pathId = getPathId(request);
        validateId(accountSessionDto, pathId);
        return true;
    }

    private Long getPathId(HttpServletRequest request) {
        Map<?, ?> pathVariables = (Map<?, ?>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
        return Long.parseLong((String) pathVariables.get("id"));
    }

    private void validateId(AccountSessionDto sessionDto, Long pathId) {
        if (!sessionDto.getId().equals(pathId)) {
            throw new SessionMismatchException();
        }
    }
}
@Profile("dev")
@Component
@Slf4j
public class LoginSessionCheckTestInterceptor implements LoginSessionCheckInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

}

и это мой WebMvcConfigurer.class

@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {

    private final AccountHandlerMethodArgumentResolver accountHandlerMethodArgumentResolver;
    private final LoginSessionCheckInterceptor loginSessionCheckInterceptor;

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        registry.addViewController("/question/form").setViewName("/pages/form");
        registry.addViewController("/register").setViewName("/pages/register");
        registry.addViewController("/login").setViewName("/pages/login");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginSessionCheckInterceptor)
                .addPathPatterns("/users/{id}")
                .addPathPatterns("/questions/edit/**")
                .addPathPatterns("/questions/delete/**")
                .excludePathPatterns("/users/login");
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(accountHandlerMethodArgumentResolver);
    }
}

, и это мой AccountControllerTest

@WebMvcTest(AccountController.class)
@RunWith(SpringRunner.class)
@ActiveProfiles("dev")
public class AccountControllerTest {

    @Autowired
    private MockMvc mvc;

...

}

я просто хочузапустить тестовый код с Компонентом для теста.в этом случае LoginSessionCheckTestInterceptor

...