java - 在 Spring 中进行 Junit 测试自定义过滤器

标签 java spring junit spring-security mocking

我正在尝试 Junit 测试我与 spring-security 一起使用的自定义过滤器。我不知道如何从我现在所在的地方着手。我知道我必须测试 if 语句的两个分支,但我想我不太确定如何去做。这是我在类里面的内容:

    @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
        throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;
    HttpSession session = req.getSession(false);
    String passwordURL = "/land";

    try {
        SecurityContextImpl sci = (SecurityContextImpl) session.getAttribute("SPRING_SECURITY_CONTEXT");

        boolean urlRequest = passwordURL.equals(req.getRequestURI());

        MyUser myUser = (MyUser) sci.getAuthentication().getPrincipal();

        if (myUser.isFirstLogin()) {
            if (urlRequest) {
                filterChain.doFilter(request, response);
            } else
                res.sendRedirect(passwordURL);
        }

    } catch (NullPointerException e) {

    }
    filterChain.doFilter(request, response);
}
}

这是我当前的测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class HandlerTests {
    CustomFilter customFilter = new CustomFilter();

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testDoFilter() throws Exception {
        HttpServletRequest request = mock(HttpServletRequest.class);
        HttpServletResponse response = mock(HttpServletResponse.class);
        FilterChain filterChain = mock(FilterChain.class);
        SecurityContextImpl sci = mock(SecurityContextImpl.class);



        customFilter.doFilter(request, response, filterChain);

        verify(request).getSession(false);
    }
}

旁注:MyUser 是一个自定义 UserDetails 类

最佳答案

您可以将其模拟给用户:

HttpSession session = mock(HttpSession.class);
when(req.getSession(false)).thenReturn(session);
SecurityContextImpl sci = mock(SecurityContextImpl.class);
when(session.getAttribute("SPRING_SECURITY_CONTEXT")).thenReturn(sci);
Authentication auth = mock(Authentication.class);
when(sci.getAuthentication()).thenReturn(auth));
MyUser user = mock(MyUser.class);
when(auth.getPrincipal()).thenReturn(user);
when(user.isFirstLogin()).thenReturn(testCaseSpecific); // two test cases
verify(filterChain).doFilter(req, res); // for true
verify(res).sendRedirect(passwordUrl); // for false

关于java - 在 Spring 中进行 Junit 测试自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48748866/

相关文章:

java - 如何自动生成N个 "distinct"颜色?

java - Android 默认 min sdk 不工作

java - HikariCp 连接池在调用 oracle 数据库中的存储过程后无法重用 session

java - 将逻辑应用于 Spring @Import 注解

android - 如何避免 Android 测试应用程序中的代码重复?

java - 带有用户输入的标记变量以退出

java - 在 java 中使用方法避免 != null

java - 在 DispatcherServlet 中未找到名称为 'spring-dispatcher' 的 URI [/FirstSpringMVCProject/stylegreen.css] 的 HTTP 请求映射

java - 如何使用 Mockito 和 JUnit 定义通过链依赖调用的方法的行为?

spring - 如何使用 Spring 的 RestTemplate 模拟 curl REST 调用?