使用Cactus+Jetty进行servelt的单元测试

Wendy ·
更新时间:2024-09-21
· 542 次阅读

  在做《Junit In Action》关于cactus和jetty结合进行集成测试的例子,看看源代码很简单,但总是运行不起来,一波三折了好几个小时才搞定。我用的cactus是1.8.1,闲言少叙,上源代码,2个类:

  待测试的servlet:

package junitbook.container;

import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession;

public class SampleServlet extends HttpServlet {     public boolean isAuthenticated(HttpServletRequest request)     {         HttpSession session = request.getSession(false);

        if (session == null)         {             return false;         }                String authenticationAttribute =             (String) session.getAttribute("authenticated");                    return Boolean.valueOf(             authenticationAttribute).booleanValue();     } }

  测试类:

package junitbook.container;

import org.apache.cactus.ServletTestCase; import org.apache.cactus.WebRequest;

public class TestSampleServletIntegration extends ServletTestCase {     private SampleServlet servlet;  

    public static Test suite()     {         System.setProperty("cactus.contextURL", "http://localhost:8080/test");// 这步很重要,一定要有

        TestSuite suite = new TestSuite("All tests with Jetty");         suite.addTestSuite(TestSampleServletIntegration.class);         return new Jetty5XTestSetup(suite);     }

    protected void setUp()     {         servlet = new SampleServlet();     }        public void testIsAuthenticatedAuthenticated()     {         session.setAttribute("authenticated", "true");                assertTrue(servlet.isAuthenticated(request));     }

    public void testIsAuthenticatedNotAuthenticated()     {         assertFalse(servlet.isAuthenticated(request));     }

    public void beginIsAuthenticatedNoSession(WebRequest request)     {         request.setAutomaticSession(false);     }        public void testIsAuthenticatedNoSession()     {         assertFalse(servlet.isAuthenticated(request));     } }

  有几点要说明:

  1.测试类要继承ServletTestCase,内置了session,request,response,可直接用

  2.jetty不要用单独下载的版本,每个cactus发行版都内置了一个jetty,在lib目录下可以找到,显然是改写过的,如果你用单独下载的,一定会抛出java.lang.NoSuchMethodException: org.mortbay.jetty.nio.SelectChannelConnector.setPort(java.lang.String),因为在单独的jetty发行版中,setPort用的参数是int,所以会抛异常,不知cactus为什么要这样搞。

  3.还要依赖commons codec这个jar

  4.如果jetty是5.x,用Jetty5XTestSetup,如果是6.x,用Jetty6XTestSetup,不过当前这个cactus用的还是jetty5.1.9(org.mortbay.jetty-5.1.9.jar),所以用Jetty5XTestSetup。

  这些,jetty启动很快,过段时间还要研究一下怎么来测试struts2。



jetty 单元 单元测试 测试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章