From Gossip@caterpillar

JUnit Gossip: 測試 Filter

如果您想測試Filter,可以繼承FilterTestCase,這個類別讓您可以使用一些由 Container管理的物件,request、 response、config、filterChain可以讓您分別取得HttpServletRequestWrapper、 HttpServletResponseWrapper、org.apache.cactus.server.FilterConfigWrapper (繼承自FilterConfig)與FilterChain物件。

直接來看個實例,假設您要撰寫一個可以過濾非法IP位址的Filter,您為這個Filter先撰寫一個測試案例:

  •  IPAddressFilterTest.java
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:

  •  IPAddressFilter.java
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中加上:
  • 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>
...

以下是測試的結果:
測試Filter