如果您想測試Filter,可以繼承FilterTestCase,這個類別讓您可以使用一些由 Container管理的物件,request、
response、config、filterChain可以讓您分別取得HttpServletRequestWrapper、
HttpServletResponseWrapper、org.apache.cactus.server.FilterConfigWrapper
(繼承自FilterConfig)與FilterChain物件。
直接來看個實例,假設您要撰寫一個可以過濾非法IP位址的Filter,您為這個Filter先撰寫一個測試案例:
package onlyfun.caterpillar.test;
import java.io.IOException;
import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;
import onlyfun.caterpillar.IPAddressFilter;
import org.apache.cactus.FilterTestCase; import org.apache.cactus.WebResponse;
public class IPAddressFilterTest extends FilterTestCase { private FilterChain chain; public void setUp() { chain = new FilterChain() { public void doFilter(ServletRequest req, ServletResponse res) throws IOException, ServletException { res.getWriter().print("Legal IP Address"); } }; } public void tearDown() { chain = null; } public void testLegalIPAddress() throws IOException, ServletException { IPAddressFilter ipFilter = new IPAddressFilter(); ipFilter.doFilter(request, response, chain); } public void endLegalIPAddress(WebResponse webResponse) { assertTrue(webResponse.getText(). equals("Legal IP Address")); } public void testIllegalIPAddress() throws IOException, ServletException { request.setRemoteIPAddress("123.123.123.123"); IPAddressFilter ipFilter = new IPAddressFilter(); ipFilter.doFilter(request, response, chain); } public void endIllegalIPAddress(WebResponse webResponse) { assertTrue(webResponse.getText(). equals("Illegal IP Address")); } }
由測試案例中可以看出Filter將實現的功能,當合法的IP來源請求時,過濾IP位址的Filter將不作任何的限制,而直接呼叫下一個Filter
(或Servlet等),在這邊您自行提供一個簡單的FilterChain實作,其目的是傳回一個"Leagal IP
Address"字串,以供我們作斷言測試,而如果是非法IP位址的話,中斷Filter進行下一步,所以您會收到一個"Illegal IP
Address"而不是"Leagal IP Address"。
依照測試案例,您完成IPAddressFilter:
package onlyfun.caterpillar;
import java.io.IOException;
import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse;
public class IPAddressFilter implements Filter { public void init(FilterConfig config) throws ServletException { }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(request.getRemoteAddr().equals("123.123.123.123")) { response.getWriter().print("Illegal IP Address"); } else { chain.doFilter(request, response); } }
public void destroy() { } }
這邊將使用Tomcat進行測試,請參考 第一個 Cactus + Tomcat 測試 瞭解如何設定,另外,還要加上FilterRedirector設定,您要在web.xml中加上:
... <filter> <filter-name>FilterRedirector</filter-name> <filter-class> org.apache.cactus.server.FilterTestRedirector </filter-class> </filter>
<filter-mapping> <filter-name>FilterRedirector</filter-name> <url-pattern>/FilterRedirector</url-pattern> </filter-mapping> ...
以下是測試的結果:

|
|