SpringEJB测试与WebMVC框架全解析
立即解锁
发布时间: 2025-08-19 02:32:45 阅读量: 3 订阅数: 11 


Spring框架下的Java开发实践与进阶
### Spring EJB 测试与 Web MVC 框架全解析
#### 1. EJB 测试策略
在开发过程中引入 EJBs 会使测试场景变得复杂,因为 EJBs 通常需要在相对重量级的 EJB 容器中执行。应用服务器内测试的构建/部署/测试周期可能从 30 秒到 10 分钟不等,而 IDE 内的单元测试只需几秒即可完成,这在潜在生产力方面存在巨大差异。以下是几种可行的 EJB 代码测试策略:
- **在 POJO 委托中实现业务功能**:在无状态会话 Bean 示例中,EJB 实现业务接口并委托给从应用上下文获取的 POJO 实现。这种策略不仅便于未来切换到仅使用 POJO 的实现,还简化了测试。通常,POJO 服务实现包含所有业务功能,可在 IDE 内进行单元或集成测试,构建/测试周期仅需几秒。虽然仍有必要在应用服务器集成测试中测试 EJB,但由于大部分开发工作在 POJO 服务中进行,此类测试频率可降低。在可行的情况下,在应用服务器外进行测试能节省大量时间,是最有价值的策略。
- **使用模拟 EJB 容器**:MockEJB(www.mockejb.org)框架提供模拟的 EJB 容器环境,可在 IDE 内直接测试部分 EJB 类,而无需将其部署到应用服务器。由于 EJB 接口和生命周期复杂,MockEJB 无法完美模拟真实 EJB 容器,但足以测试大部分 EJB 功能。即便开发时能在应用服务器外测试大部分功能,仍需定期在应用服务器中进行测试,因为模拟环境无法替代真实环境。此外,MockEJB 还允许创建模拟 EJB,可与真实 EJB 一起部署在应用服务器中,用于隔离被测试的 EJB 或提供测试数据。
- **在应用服务器内进行集成测试**:最后一种策略是在应用服务器内进行 EJB 集成测试。虽然部署整个应用到服务器的时间可能从 15 秒到数分钟不等,此策略并非最具吸引力,但优点是能在 EJB 最终运行的真实容器中进行测试。即便不是主要测试策略,也应定期使用。启动服务器内集成测试的方法有多种:
- **Jakarta Apache Cactus**:(http://jakarta.apache.org/cactus/index.html)允许通过命令行 Ant 构建,在应用服务器内的部署测试应用中透明地远程运行普通 JUnit 测试。
- **Canoo WebTest**:(http://webtest.canoo.com/webtest/manual/WebTestHome.html)通过驱动视图层进行集成测试,以测试相关类。
以下是通过 Cactus 在应用服务器内运行单元测试的示例:
```java
public class ProxyBasedAccessTest extends TestCase {
public static Test suite() {
ServletTestSuite suite = new ServletTestSuite();
suite.addTestSuite(ProxyBasedAccessTest.class);
return suite;
}
public void testLocalSLSBProxyFactoryBean() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(ClassUtils
.addResourcePathToPackagePath(this.getClass(), "applicationContext.xml"));
SimpleServiceClient client = (SimpleServiceClient) ctx
.getBean("simpleServiceClient", SimpleServiceClient.class);
client.useSimpleService();
}
}
```
此测试为普通 JUnit 测试,区别在于定义了 JUnit 的可选 `suite()` 方法,返回 Cactus `ServletResponse` 作为测试套件。也可让测试用例类继承 Cactus 的 `CactusTestCase` 类。测试代码可执行普通 JUnit 测试能做的操作,只是在应用服务器内运行。
除编写兼容 Cactus 的测试用例外,还需对 J2EE 应用的 WAR 或 EAR 文件进行 Cactify 处理。在构建过程中,Ant 脚本可使用 `<cactify>` 任务在 Web 应用中插入特殊重定向器 Servlet,该重定向器将客户端构建文件指定的测试重定向到服务器上运行的测试。通过 Cactus 运行一个或多个服务器端测试,只需将 J2EE 应用部署到容器,然后在客户端 Ant 构建文件中使用 `<cactus>` Ant 任务,此任务与普通 Ant `<junit>` 任务类似,只是通过与重定向器通信运行服务器端测试,可在本地查看测试错误。Cactus 还提供编程 API,但多数用户通过其提供的特殊 Ant 任务控制测试。
需要注意的是,使用 Cactus 在应用服务器内测试 EJBs 或其他服务器端组件时,难以重现失败场景,如在单个测试中验证无法获取数据库连接时的行为。因此,不建议将此方法作为单元测试策略的主要依据。
#### 2. Spring Web MVC 框架概述
Spring 提供基于 Model - View - Controller(MVC)范式的 Web 框架,虽在某些方面与 Struts 和 WebWork 等流行 MVC 框架相似,但具有显著优势。Spring MVC 为 Web 应用提供了现成的工作流实现,具有高度灵活性,支持多种视图技术,并能通过依赖注入与 Spring 中间层逻辑完全集成。
#### 3. 简单示例
在深入了解 Spring 的 Web 相关特性之前,先通过一个简单页面展示主要概念。创建一个名为 `SimpleController` 的控制器,该控制器继承 `AbstractController`,用于准备模型并将其传递给视图(如 JSP)。接收到请求时,`SimpleController` 会创建一个 `ModelAndView` 对象,指定视图名称为 `welcome`,并向模型中添加一个 `Date` 对象,最后返回该 `ModelAndView` 对象。
```java
import org.springframework.web.servlet.mvc.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class SimpleController extends AbstractController {
public ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// create a model-and-view using 'welcome’
ModelAndView mav = new ModelAndView("welcome");
// then, add an object to it and return it
mav.addObject("date", new Date());
return mav;
}
}
```
需在 `ApplicationContext` 中配置控制器,因为控制器和其他 Web 层对象通过 Spring 的依赖注入进行配置。处理 Web 工作流的应用上下文必须是 `WebApplicationContext` 的实例。
Spring 的 Web MVC 框架围绕 `DispatcherServlet` 或前端控制器构建,用户通过 Web 浏览器连接到该 `DispatcherServlet`。需在 `web.xml` 文件中定义该 Servlet,并在同一目录(`/WEB-INF/`)下创建 `[servlet - name] - servlet.xml` 文件,该文件定义 `WebApplicationContext` 中的 Bean,`SimpleController` 也在此文件中定义。`WebApplicationContext` 包含所有 Web 相关组件,其父上下文包含中间层服务和必要的支持对象(如数据源)。
示例中 `[servlet - name].xml` 文件(不包含 XML 头部)内容如下:
```xml
<beans>
<bean name="/index.html"
class="org.springframework.sample.web.SimpleController"/>
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix"><value>/WEB-INF/jsp</value></property>
<property name="suffix"><value>.jsp</value></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
</bean>
</beans>
```
`web.xml` 文件中声明 `DispatcherServlet` 并将所有请求映射到该 Servlet 的代码如下:
```xml
<servlet>
<servlet-name>sample</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>sample</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
```
还需创建实际的 JSP 页面向用户显示
0
0
复制全文
相关推荐







