복붙노트

[SPRING] 봄 부팅 응용 프로그램을 사용하여 Mockito의 맞춤 필터를 무시하거나 건너 뛰는 방법

SPRING

봄 부팅 응용 프로그램을 사용하여 Mockito의 맞춤 필터를 무시하거나 건너 뛰는 방법

나는 스프링 부트 응용 프로그램과 테스트 용 mockito를 사용하고 있습니다. 아래는 일부 파일과 코드 샘플입니다.

public class CustomerInfoFilter extends GenericFilterBean
{

    @Override
    public void doFilter (ServletRequest request,
                          ServletResponse response,
                          FilterChain chain)
        throws IOException,
        ServletException
    {
        Customer customer = (Customer)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        // some more logic 

        // call next filter in the filter chain
        chain.doFilter(request, response);
     }
}

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{

    @Autowired
    public void configAuthentication (AuthenticationManagerBuilder auth) throws Exception
    {
        auth.jdbcAuthentication()........... some logic
    }

    protected void configure (HttpSecurity http) throws Exception
    {
        http.addFilterAfter(new CustomerInfoFilter(customerInfoDao), BasicAuthenticationFilter.class);
        // Some logic
    }
}

다음은 Mockito 테스트로 작성된 코드입니다.

@Test
public void verifyCustomerInfoUnauthorized () throws Exception
{
    mockMvc.perform(MockMvcRequestBuilders.post("/customer").contentType(
    MediaType.APPLICATION_JSON).content("{}").accept(MediaType.APPLICATION_JSON)).andExpect(
            status().isUnauthorized()).andExpect(status().is(401));
}

미안 나는 봄과 mockito 새로운 :) 모든 도움을 주시면 감사하겠습니다.

해결법

  1. ==============================

    1.

    @Mock
    SecurityContext context;
    
    @Mock
    Authentication auth;
    
    
    @Mock
    Principal principal;
    
    @Test
    public void verifyCustomerInfoUnauthorized () throws Exception
    {
    
        when(context.getAuthentication()).thenReturn(auth);
        when(context.getAuthentication().getPrincipal()).thenReturn(principal);
        SecurityContextHolder.setContext(context);
        mockMvc.perform(MockMvcRequestBuilders.post("/customer").principal().contentType(
        MediaType.APPLICATION_JSON).content("{}").accept(MediaType.APPLICATION_JSON)).andExpect(
            status().isUnauthorized()).andExpect(status().is(401));
    }
    

    위와 비슷한 방법으로 테스트하거나 직접 mock을 설정할 수 있습니다. 어느 쪽이든 그것은 트릭을해야합니다. 가장 중요한 부분은 .setContext () 부분입니다. 그것이 널 포인터가 나오는 곳입니다.

    나는 이것이 이것에 대해 가장 깨끗한 방법이라고 생각한다.

  2. from https://stackoverflow.com/questions/53774909/how-to-bypass-or-skip-customfilter-in-mockito-with-springboot-applicaiton by cc-by-sa and MIT license