我在学习junit在线教程的时候(网址是
http://caterpillar.onlyfun.net/Gossip/JUnit/JUnitGossip.htm),在里面的第一個 Cactus + Tomcat 測試 中遇到了问题。
详细情况是这样的:
我根据他所说的方法,设置了web.xml和添加了LoginServletTest(testCase)和LoginServlet两个servlet,之后进行测试。发现会报error message="escaped absolute path not valid" type="org.apache.commons.httpclient.URIException"的错误。在网上搜索了一阵子之后,有人说是由于httpclient对url处理的问题造成的。之后我重新新建了一个项目,名称叫做CactusDemo,之前的项目名称叫Cactus Demo(注意Cactus和Demo之间有一个空格)。同样的设置了相关的web.xml和jar包之后发布。测试正常。
但是新的问题又出现了,当我启动tomcat之后,如果我首先运行
http://localhost:8088/CactusDemo/ServletTestRunner?suite=onlyfun.caterpillar.test.LoginServletTest也就是没有空格那个项目的链接的话显示的是一切正常,而且链接到有空格的目录也是正常的
http://localhost:8088/Cactus%20Demo/ServletTestRunner?suite=onlyfun.caterpillar.test.LoginServletTest。但是如果首先运行的是后者的话,就是先点有空格的话,即使接着再运行没有空格也会返回前面所说的escaped absolute path not valid的错误信息,直到你重启tomcat才会正常。
在这里请问有哪位大虾能够帮助小弟解解惑呢?
祝各位仁兄工作顺利,学习进步,并祝愿javaeye越办越好。
下面附上相关的文件和配置信息
错误信息如下
<?xml version="1.0" encoding="UTF-8" ?>
- <testsuites>
- <testsuite name="onlyfun.caterpillar.test.LoginServletTest" tests="2" failures="0" errors="2" time="0.234">
- <testcase name="testValidUser" time="0.157">
<error message="escaped absolute path not valid" type="org.apache.commons.httpclient.URIException">org.apache.commons.httpclient.URIException: escaped absolute path not valid at org.apache.commons.httpclient.URI.setRawPath(URI.java:2837) at
org.apache.commons.httpclient.URI.parseUriReference(URI.java:2023) at
org.apache.commons.httpclient.URI.<init>(URI.java:147) at
org.apache.commons.httpclient.HttpMethodBase.getURI(HttpMethodBase.java:265) at
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:383) at
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346) at
org.apache.cactus.internal.client.connector.http.HttpClientConnectionHelper.connect_aroundBody0(HttpClientConnectionHelper.java:144) at
org.apache.cactus.internal.client.connector.http.HttpClientConnectionHelper.connect_aroundBody1$advice(HttpClientConnectionHelper.java:307) at
org.apache.cactus.internal.client.connector.http.HttpClientConnectionHelper.connect(HttpClientConnectionHelper.java:1) at
org.apache.cactus.internal.client.connector.http.DefaultHttpClient.callRunTest(DefaultHttpClient.java:163) at
org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest_aroundBody0(DefaultHttpClient.java:81) at
org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest_aroundBody1$advice(DefaultHttpClient.java:307) at
org.apache.cactus.internal.client.connector.http.DefaultHttpClient.doTest(DefaultHttpClient.java:1) at
org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runWebTest(HttpProtocolHandler.java:164) at
org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest_aroundBody0(HttpProtocolHandler.java:83) at
org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest_aroundBody1$advice(HttpProtocolHandler.java:307) at
org.apache.cactus.internal.client.connector.http.HttpProtocolHandler.runTest(HttpProtocolHandler.java:1) at
org.apache.cactus.internal.client.ClientTestCaseCaller.runTest(ClientTestCaseCaller.java:145) at
org.apache.cactus.internal.AbstractCactusTestCase.runBareClient(AbstractCactusTestCase.java:218) at
org.apache.cactus.internal.AbstractCactusTestCase.runBare(AbstractCactusTestCase.java:134) at
org.apache.cactus.server.runner.ServletTestRunner.run(ServletTestRunner.java:309) at
org.apache.cactus.server.runner.ServletTestRunner.doGet_aroundBody0(ServletTestRunner.java:187) at
org.apache.cactus.server.runner.ServletTestRunner.doGet_aroundBody1$advice(ServletTestRunner.java:225) at
org.apache.cactus.server.runner.ServletTestRunner.doGet(ServletTestRunner.java:1) at
javax.servlet.http.HttpServlet.service(HttpServlet.java:617) at
javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619)</error>
</testcase>
- <testcase name="testInValidUser" time="0.015">
<error message="escaped absolute path not valid" type="org.apache.commons.httpclient.URIException">由于字数太多而且跟上面的堆栈信息一样,因此不重复了</error>
</testcase>
</testsuite>
</testsuites>
web.xml配置信息
<!-- Cactus框架开始 -->
<description>
Cactus Demo
</description>
<display-name>Cactus Demo</display-name>
<servlet>
<servlet-name>
ServletRedirector
</servlet-name>
<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>
<servlet>
<servlet-name>
ServletTestRunner
</servlet-name>
<servlet-class>org.apache.cactus.server.runner.ServletTestRunner</servlet-class>
</servlet>
<servlet>
<servlet-name>
HelloServlet
</servlet-name>
<servlet-class>onlyfun.caterpillar.test.HelloServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>
LoginServlet
</servlet-name>
<servlet-class>onlyfun.caterpillar.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletRedirector</servlet-name>
<url-pattern>/ServletRedirector</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletTestRunner</servlet-name>
<url-pattern>/ServletTestRunner</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/LoginServlet</url-pattern>
</servlet-mapping>
<!-- Cactus框架结束 -->
LoginServletTest和LoginServlet源代码
LoginServletTest
package onlyfun.caterpillar.test;
import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import onlyfun.caterpillar.LoginServlet;
public class LoginServletTest extends ServletTestCase {
public void beginValidUser(WebRequest webRequest) {
webRequest.addParameter("username", "justin");
webRequest.addParameter("password", "123456");
}
public void testValidUser() {
LoginServlet loginServlet = new LoginServlet();
assertTrue(loginServlet.isValidUser(request));
}
public void beginInValidUser(WebRequest webRequest) {
webRequest.addParameter("username", "guest");
webRequest.addParameter("password", "123456");
}
public void testInValidUser() {
LoginServlet loginServlet = new LoginServlet();
assertFalse(loginServlet.isValidUser(request));
}
}
LoginServlet
package onlyfun.caterpillar;
import javax.servlet.http.*;
public class LoginServlet extends HttpServlet {
public boolean isValidUser(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");
if(username == null ||
password == null ||
!username.equals("justin") ||
!password.equals("123456")) {
return false;
}
else {
return true;
}
}
}
添加的jar如下
在如没有特殊说明均可在
http://jakarta.apache.org/site/downloads/downloads_cactus.cgi下载
junit-3.8.2.jar
aspectjrt-1.5.3.jar
cactus.core.framework.uberjar.javaEE.14-1.8.1.jar
commons-httpclient-3.1.jar
commons-logging-1.1.jar
commons-codec-1.4.jar(这个忘了,不过网上搜搜就会有)
servlet-api.jar(tomcat自带)
测试环境的配置如下
myeclipse Version: 5.1.0 GA
Tomcat 6.0.18
问题补充:这个测试当时是直接用网上的例子作为测试的,而且测试的目的是假设已经有了一个后台的login servlet,但是前台的页面还没有写好的情况下,以模拟的前后文的方式进行测试。
现在的问题是这样子的:有两个项目,其中一个项目跟另外一个项目完全一样,只不过是名字中间增加了一个空格。然后如果先用没有空格的项目来测试的话,两个项目都可以测试通过,但是如果先测试有空格的项目的话,两个项目都测试不通过。
photon 写道
人工login的时候,有这样的异常吗?
相关推荐
单元测试代码是不会出现在最终软件产品中的,所以最好为单元测试代码与被测试代码创建单独的目录,并保证测试代码和被测试代码使用相同的包名。这样既保证了代码的分离,同时还保证了查找的方便。在项目 coolJUnit ...
5. Junit 测试的分类:Junit 有不同的使用技巧,以后慢慢地分别讲叙,如 Class 测试、Jsp 测试、Servlet 测试、Ejb 测试等。 6. Junit 的下载和安装:去 Junit 主页下载最新版本 3.8.1 程序包 junit-3.8.1.zip,用 ...
《学生信息管理系统——基于JSP、JUnit、Servlet、Filter与SQL的实现》 学生信息管理系统是信息化教育领域中常见的应用,它旨在通过计算机技术管理大量的学生数据,提高工作效率,减少人为错误。本系统采用JavaWeb...
在`JUnit & 简单Junit使用代码`这个文件中,可能包含了一个或多个示例,展示了如何创建测试类、编写测试方法、使用断言以及设置测试环境。例如,可能有一个简单的数学操作类`MathUtils`,以及对应的测试类`...
在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...
3. **异常处理**:测试异常处理逻辑,确保在出现错误时程序行为符合预期。 4. **正向测试**:验证正常输入和操作的正确性。 5. **负向测试**:验证程序对错误输入和非法操作的响应。 **自动饮料机案例** 在这个...
对于单元测试,我们需要在代码中创建测试类,比如`MyTestClass`,并使用JUnit提供的注解来定义测试方法。例如: ```java import org.junit.*; public class MyTestClass { @Test public void testMyFunction() {...
在Java世界里,Junit是广泛使用的单元测试框架,它为开发者提供了方便、高效的测试工具。本篇文章将深入探讨如何利用Junit进行单元测试,并分享一些最佳实践。 首先,我们需要了解什么是单元测试。单元测试是对软件...
在Java中使用JUnit单元测试是软件开发过程中不可或缺的一部分。单元测试是指在开发过程中,对代码的一部分进行测试,以确保代码的正确性和可靠性。在Java中,JUnit是最流行的单元测试框架之一。 单元测试的重要性 ...
例如,文件可能会讲解如何设置一个基本的JUnit测试类,通常这个类会继承自`junit.framework.TestCase`(对于较旧的JUnit版本)或者使用注解`@RunWith(JUnit4.class)`(对于JUnit 4及以上版本)。 测试类中的每个...
3. **集成测试**:虽然JUnit主要用于单元测试,但结合Servlet容器(如Tomcat)和工具如Arquillian,也可以进行简单的集成测试。 4. **测试覆盖率**:使用JaCoCo等工具可以测量代码覆盖率,确保测试的全面性。 5. *...
通过右键点击测试类或测试方法 -> Run As -> JUnit Test,MyEclipse会启动JUnit测试并显示测试结果,包括通过的测试、失败的测试以及错误信息。此外,MyEclipse的JUnit视图(JUnit View)可以展示所有项目的测试结果...
【Junit单元测试完整案例】深入解析 在软件开发中,单元测试是验证代码功能是否正确、独立单元是否按预期工作的关键步骤。Junit作为Java领域最常用的单元测试框架,为开发者提供了简单易用的API来进行测试。本案例...
单元测试之道(Java):使用JUnit进行单元测试。单元测试是提高代码质量的有效手段,但大部分开发人员由于种种原因都不乐意进行单元测试。
JUnit是Java编程语言中最...随着JUnit4和JUnit5的出现,更多的高级特性,如参数化测试、异步测试、规则等,使得单元测试更加灵活和强大。不过,了解JUnit3的基本概念和实践对于理解后续版本的演变和使用是至关重要的。
1. **创建测试类**:首先,你需要创建一个测试类,这个类通常以`Test`结尾,并且继承自`junit.framework.TestCase`(对于JUnit4)或使用`@org.junit.Test`注解(对于JUnit5)标记测试方法。 2. **测试方法**:测试...