已实施doFilter().如何用jUnit正确覆盖过滤器?
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws java.io.IOException, javax.servlet.ServletException
{
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String currentURL = request.getRequestURI();
if (!currentURL.equals("/maintenance.jsp") && modeService.getOnline())
{
response.sendRedirect("/maintenance.jsp");
}
filterChain.doFilter(servletRequest, servletResponse);
}
Run Code Online (Sandbox Code Playgroud)
sli*_*lim 35
ServletRequest,ServletResponse并且FilterChain都是接口,因此您可以手动或使用模拟框架轻松地为它们创建测试存根.
使模拟对象可配置,以便您可以准备一个预设响应getRequestURI(),以便您可以查询ServletResponse以断言已调用sendRedirect.
注入模拟ModeService.
调用doFilter,将模拟ServletRequest,ServletResponse和FilterChain作为参数传递.
@Test
public void testSomethingAboutDoFilter() {
MyFilter filterUnderTest = new MyFilter();
filterUnderTest.setModeService(new MockModeService(ModeService.ONLINE));
MockFilterChain mockChain = new MockFilterChain();
MockServletRequest req = new MockServletRequest("/maintenance.jsp");
MockServletResponse rsp = new MockServletResponse();
filterUnderTest.doFilter(req, rsp, mockChain);
assertEquals("/maintenance.jsp",rsp.getLastRedirect());
}
Run Code Online (Sandbox Code Playgroud)
实际上,您需要将设置移动到@Before setUp()方法,并编写更多@Test方法来覆盖每个可能的执行路径.
...你可能会使用像JMock或Mockito这样的模拟框架来创建模拟,而不是MockModeService我在这里使用的假设等.
这是一种单元测试方法,而不是集成测试.您只是在运行被测单元(和测试代码).
Cod*_*und 19
你可以为了嘲笑上述使用模拟框架HttpServletRequest,HttpServletResponse以及FilterChain对象和他们的行为.根据框架的不同,您可以使用某些功能来验证在执行代码期间是否对所采用的模拟对象执行了正确的操作.
例如,当使用Mockito模拟框架时,提供的doFilter()方法可以使用下面的测试用例进行JUnit测试:
@Test
public void testDoFilter() throws IOException, ServletException {
// create the objects to be mocked
HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);
FilterChain filterChain = mock(FilterChain.class);
// mock the getRequestURI() response
when(httpServletRequest.getRequestURI()).thenReturn("/otherurl.jsp");
MaintenanceFilter maintenanceFilter = new MaintenanceFilter();
maintenanceFilter.doFilter(httpServletRequest, httpServletResponse,
filterChain);
// verify if a sendRedirect() was performed with the expected value
verify(httpServletResponse).sendRedirect("/maintenance.jsp");
}
Run Code Online (Sandbox Code Playgroud)
小智 12
如果您使用Spring,那么它有自己的模拟:
例如,您可以添加标题并设置测试Uri.
所以你的测试可以像这样:
@RunWith(MockitoJUnitRunner.class)
public class TokenAuthenticationFilterTest {
private static final String token = "260bce87-6be9-4897-add7-b3b675952538";
private static final String testUri = "/testUri";
@Mock
private SecurityService securityService;
@InjectMocks
private TokenAuthenticationFilter tokenAuthenticationFilter = new TokenAuthenticationFilter();
@Test
public void testDoFilterInternalPositiveScenarioWhenTokenIsInHeader() throws ServletException, IOException {
MockHttpServletRequest request = new MockHttpServletRequest();
request.addHeader(TOKEN, token);
request.setRequestURI(testUri);
MockHttpServletResponse response = new MockHttpServletResponse();
MockFilterChain filterChain = new MockFilterChain();
when(securityService.doesExistToken(token)).thenReturn(true);
tokenAuthenticationFilter.doFilterInternal(request, response, filterChain);
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35438 次 |
| 最近记录: |