Seam的集成测试
Integration Testing
集成测试和单元测试一起使用。它应该测试单元的整合。实际上,大多数集成测试模拟客户端调用,因此,你可以有一个完整的功能测试,从表现层到业务逻辑层,再到持久层。
这些测试非常有用,能更深入开发,调整后端系统。它立即让你明白是否你在业务层所做的改变将影响Web页面中断。当然,这取决于你是否及时更新测试,一旦你更新了JSF页面,也应该对测试做相应更改。
要执行集成测试,应该使用TestNG和Seam基础类的组合来模拟Faces请求。此例还使用早先的单元测试的例子。集成测试运行来增加一个房子。
-
public class HouseTest extends SeamTest{
-
@Test
-
public void testAddHouse() throws Exception{
-
new FacesRequest(){
-
@Override
-
protected void processValidations() throws Exception {
-
validateValue("#{house.address}", "123 Main Street");
-
validateValue("#{house.city}", "Columbus");
-
validateValue("#{house.state}", "OH");
-
assert !isValidationFailure();
-
}
-
@Override
-
protected void updateModelValues() throws Exception {
-
setValue("#{house.address}", "123 Main Street");
-
setValue("#{house.city}", "Columbus");
-
setValue("#{house.state}", "OH");
-
}
-
@Override
-
protected void invokeApplication() {
-
assert invokeMethod("#{salesManager.addHouse}").equals("success");
-
}
-
@Override
-
protected void renderResponse() {
-
assert getValue("#{house.address}").equals("123 Main Street");
-
assert getValue("#{house.city}").equals("Columbus");
-
assert getValue("#{house.state}").equals("OH");
-
}
-
}.run();
-
}
-
}
第一件事是继承SeamTest,SeamTest类是Seam核心类的一部分。继承此类后,就可以使用两个核心操作创建一个请求。你可以使用超类来创建一个FacesRequest或者NonFacesRequest。这两个类是SeamTest对象的内部类,我们会创建类的实现通过重写方法调用。每个方法调用代表了JSF生命周期的一部分。可以拦截此方式,测试请求的各个部份。方法:
getViewId() JSF视图ID或非Faces请求的页面名
applyRequestValues() 应用请求值阶段定义JSF和组件页面的交互
processValidations() 处理验证阶段的方法
updateModelValues() 更新模型值阶段的方法
invokeApplication() 用于方法调用期间和重写方法
renderResponse() 呈现响应期间出现
你可以选择要覆盖的方法。在例子中,我们验证和设置值传递到业务层,在House对象设置值,验证项,然后提供House对象到数据库。
从长远看,测试能节省宝贵的时间。它帮助识别错误和应用程序异常行为,尤其是在大项目中,测试占了相当大比例的时间。