有人能指出一个如何使用ServletUnit来测试JSP的例子吗?我需要调用registerServlet()吗?如果是这样,我会通过什么类名?
答案 0 :(得分:2)
如果要使用默认的Jasper编译器,则不需要registerServlet。但是,我需要Jasper jar及其对CLASSPATH的依赖。我需要一个基本的JSP来编译和渲染的Maven依赖项是:
<dependency>
<groupId>tomcat</groupId>
<artifactId>jasper</artifactId>
<version>3.3.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>tomcat</groupId>
<artifactId>jasper-compiler</artifactId>
<version>5.5.23</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>tomcat</groupId>
<artifactId>tomcat-util</artifactId>
<version>5.5.23</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>tomcat</groupId>
<artifactId>core_util</artifactId>
<version>3.3.2</version>
<scope>test</scope>
</dependency>
我被困在JDK1.4项目中,因此您可以使用更新的版本。我还没有得到标准的taglib工作......
答案 1 :(得分:0)
这就是我现在用来测试JSP渲染和验证表单和转发的内容。
第一个Maven依赖项
<!-- Testing JSP -->
<dependency>
<groupId>net.sourceforge.openutils</groupId>
<artifactId>openutils-testing4web</artifactId>
<version>1.2.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-context</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jsp-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
<exclusion>
<artifactId>jasper-runtime</artifactId>
<groupId>tomcat</groupId>
</exclusion>
<exclusion>
<artifactId>jasper-compiler</artifactId>
<groupId>tomcat</groupId>
</exclusion>
<exclusion>
<artifactId>jasper-compiler-jdt</artifactId>
<groupId>tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>catalina</artifactId>
<version>${tomcat.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>servlet-api</artifactId>
<version>${tomcat.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>jasper</artifactId>
<version>${tomcat.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>jasper-el</artifactId>
<version>${tomcat.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>jsp-api</artifactId>
<version>${tomcat.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${javax.servlet.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>jasper-jdt</artifactId>
<version>6.0.29</version>
<scope>test</scope>
</dependency>
<!-- log configuration -->
tomcat.version是6.0.39你可以随意尝试现代的tomcat版本,7或8但是关心依赖有时会变得有点模糊。
javax.servlet.version是3.0.1
接下来我定义了一个通用测试类,它通过我的所有测试扩展。我有一个每个控制器的测试类。
import it.openutils.testing.junit.AbstractDbUnitJunitSpringContextTests;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.core.io.Resource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestExecutionListeners;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
import org.springframework.test.context.support.DirtiesContextTestExecutionListener;
import org.springframework.test.context.transaction.TransactionalTestExecutionListener;
import org.springframework.transaction.annotation.Transactional;
import com.meterware.servletunit.ServletRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/integration/application-database-test.xml", "/integration/mvc-dispatcher-servlet-test.xml" })
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionalTestExecutionListener.class })
public abstract class ControllerIntegrationCommonTest extends AbstractDbUnitJunitSpringContextTests
{
/**
* The Web CLient for JSP rendeting Test
*/
protected ServletRunner servletRunner;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception
{
Resource web = this.applicationContext.getResource("/WEB-INF/web.xml");
if (servletRunner == null)
{
servletRunner = new ServletRunner(web.getFile(),null);
}
}
@After
public void setDown() throws Exception
{
servletRunner.shutDown();
}
}
如果要从Spring Junit上下文中运行它,则需要@ContextConfiguration,@ TestExecutionListeners,如果删除则会得到一个很好的java.lang.IllegalStateException:无法加载ApplicationConext。
请注意,我使用Web.xml实例化ServletRunner。这当然是强制性的,与我的生产非常相似。第二个参数,contextPath设置为Null。对于我的测试,我不需要。我将您推荐到API以获取更完整的信息。
完成配置后,即可轻松完成测试。我添加到示例中:
PostMethodWebRequest webRequest = new PostMethodWebRequest("http://myserver/setup/checkXML",true);
webRequest.setParameter("param1", "11112");
File file = new File("src/test/resources/datasets/myxml.xml");
webRequest.selectFile("fileData",file,"multipart/form-data");
WebResponse webResponse = servletRunner.getResponse(webRequest);
assertNotNull(webResponse);
assertTrue(webResponse.getURL().getPath().contains("checkXML"));
assertNotNull(webResponse.getElementsByTagName("resultCheck"));
log.debug(" ----------------- ");
log.debug(webResponse.getText());
log.debug(" ----------------- ");
webResponse.getFormWithID("resultsForm").getSubmitButtons()[0].click();
在这个例子中,我将发布一个帖子上传文件。您需要使用参数mimeencoded set as true创建PostMethodWebRequest。如果不是,您将收到一些有趣的错误消息。 添加文件只是使用了方法。您可以在API中看到,您可以上传一个文件或一组。
最后一个示例仅适用于make Get request
GetMethodWebRequest webRequest = new GetMethodWebRequest("http://myserver/setup/addarea");
webRequest.setParameter("param", "11");
WebResponse webResponse = servletRunner.getResponse(webRequest);
assertNotNull(webResponse);
assertTrue(webResponse.getURL().getPath().contains("addsomething"));
assertNotNull(webResponse.getElementsByTagName("listofsomething"));
assertNotNull(webResponse.getElementsByTagName("someelement"));
log.debug(" ----------------- ");
log.debug(webResponse.getText());
log.debug(" ----------------- ");
在此示例中,我向控制器发出Get请求。与前面一样,我发送一些参数然后得到响应。在那里,我检查URL是否符合我的预期,并验证JSP是否呈现了一些元素。
请注意,对于构建WebRequest,我必须使用格式良好的URL,但没有关于服务器名称的问题,Servlet单元根本不使用它,您不需要在任何地方定义。
我希望它可以帮到你。玩得开心!!