我正在尝试 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/