JUnit学习笔记2---解析controller实例代码
来源:互联网 发布:广州市启凡网络 编辑:程序博客网 时间:2024/06/06 05:11
昨晚未进行代码部分的解析,现在呈现一下组件测试的简单例子:
组件代码:
Controller.java
package junitbook.sampling;public interface Controller{ Response processRequest(Request request); void addHandler(Request request, RequestHandler requestHandler);}
DefaultController.java
package junitbook.sampling;import java.util.HashMap;import java.util.Map;public class DefaultController implements Controller{ private Map requestHandlers = new HashMap(); protected RequestHandler getHandler(Request request) { if (!this.requestHandlers.containsKey(request.getName())) { String message = "Cannot find handler for request name " + "[" + request.getName() + "]"; throw new RuntimeException(message); } return (RequestHandler) this.requestHandlers.get( request.getName()); } public Response processRequest(Request request) { Response response; try { response = getHandler(request).process(request); } catch (Exception exception) { response = new ErrorResponse(request, exception); } return response; } public void addHandler(Request request, RequestHandler requestHandler) { if (this.requestHandlers.containsKey(request.getName())) { throw new RuntimeException("A request handler has " + "already been registered for request name " + "[" + request.getName() + "]"); } else { this.requestHandlers.put(request.getName(), requestHandler); } }}
Request.java
package junitbook.sampling;public interface Request{ String getName();}
RequestHandler.java
package junitbook.sampling;public interface RequestHandler{ Response process(Request request) throws Exception;}
Response.java
package junitbook.sampling;public interface Response{}
ErroResponse.java
package junitbook.sampling;public class ErrorResponse implements Response{ private Request originalRequest; private Exception originalException; public ErrorResponse(Request request, Exception exception) { this.originalRequest = request; this.originalException = exception; } public Request getOriginalRequest() { return this.originalRequest; } public Exception getOriginalException() { return this.originalException; }}
--------------------------------------------------------------------------------------------------------------------------------------------------------
我们就是针对以上的代码写测试程序,可见这个controller很像在struts中的mappingfoward,也就是控制转向程序,有申请,验证,转向和异常处理,在这里,验证的方法是通过request里面的name完成的,提供的一个注册的name是DEFAULT_NAME=test,如果我们的request中的name的值不是test,则发生了错误,转入错误处理,那么在这里还可能产生异常!所以在测试的时候,我们可以选择不同的assertXXX进行多重的判断,作者是这样说的:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
JUnit最佳实践:在assert调用中解释失败的原因,无论何时,只要你调用assertTrue,assertNotNull,assertFalse方法,请记住使用第一个参数是String类型的那个签名。这个参数可以让你提供一个有意义的文本描述,在断言失败的时候JUnit test runner会显示那个描述,若不使用这个参数,那么当测试失败时就比较难于找到失败的原因。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
下面开始解析一个测试类(在书中提供了八个测试类)
package junitbook.sampling;import junit.framework.TestCase;public class TestDefaultController extends TestCase ----此处是注册程序为JUnit的程序!!!{ private DefaultController controller; ----开始定义在测试中要用到的私有成员 private Request request; private RequestHandler handler; protected void setUp() throws Exception ----setUp是程序开始的地方,DefaultController类实例化 { ----通过昨天的学习我们知道在这个过程中,存在Result Listener和TestSuite的创建,这些都是隐藏的! controller = new DefaultController(); request = new TestRequest(); handler = new TestHandler(); controller.addHandler(request, handler); } private class TestRequest implements Request ----虽然此处的函数名字是TestXXX,但是,他并是我们的测试类,真正的测试类一定是以“testXXX”! { ----那么这个类就是对我们的测试进行准备的!这个类完成了对Request的复写,完善了功能!! private static final String DEFAULT_NAME = "Test";---也就是说,这是对接口的填充! private String name; public TestRequest(String name) { this.name = name; } public TestRequest() { this(DEFAULT_NAME); } public String getName() ----getname() 个人认为是这个controller的核心,开始找了半天,只看到在接口中有getname,但是没有定义 { ----居然将方法的复写写道这里???!!! return this.name; } } private class TestHandler implements RequestHandler ----handler复写,就是向Response提交request 这里的Request是TestRequest { public Response process(Request request) throws Exception { return new TestResponse(); } } private class TestResponse implements Response ----在Response中处理TestRequest
{ ----大家可见这里是空啊。恩,不用什么处理,假使没有进行到这里,就是发生错误或异常了!! // empty } public void testAddHandler() ----好,准备完毕,开始真正的测试吧 { RequestHandler handler2 = controller.getHandler(request); assertSame(handler2, handler); ----注入两个request 这两个request是相同的,所以可以在reponse中得到验证! } public void testProcessRequest() ----这是reponse的核心,请注意这里使用了很多的assertXXX { Response response = controller.processRequest(request); assertNotNull("Must not return a null response", response); assertEquals(TestResponse.class, response.getClass()); } private class TestExceptionHandler implements RequestHandler -----发生异常时的处理 { public Response process(Request request) throws Exception { throw new Exception("error processing request"); } } public void testProcessRequestAnswersErrorResponse() -----我们还有一个ErrResponse,能正确的跳转到这里么? { TestRequest request = new TestRequest("testError"); TestExceptionHandler handler = new TestExceptionHandler(); controller.addHandler(request, handler); Response response = controller.processRequest(request); assertNotNull("Must not return a null response", response); assertEquals(ErrorResponse.class, response.getClass()); } public void testGetHandlerNotDefined() ----得到一个没有注册过的request,不用说,是错误 { TestRequest request = new TestRequest("testNotDefined"); try { controller.getHandler(request); fail("An exception should be raised if the requested " + "handler has not been registered"); } catch (RuntimeException expected) { assertTrue(true); } } public void testAddRequestDuplicateName() ---复制一个request,看是否有运行时错误 { TestRequest request = new TestRequest(); TestHandler handler = new TestHandler(); try { controller.addHandler(request, handler); fail("An exception should be raised if the default " + "TestRequest has already been registered"); } catch (RuntimeException expected) { assertTrue(true); } }}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
本篇文章的两个地址为
http://blog.csdn.net/watson243671
http://buildyourdream.spaces.live.com/
- JUnit学习笔记2---解析controller实例代码
- JUnit学习笔记2---解析controller实例代码
- Junit学习笔记1---起步,探索和一个controller实例
- Junit学习笔记1---起步,探索和一个controller实例
- junit学习笔记2
- JUnit之学习笔记2
- 基础学习笔记 + 代码实例 (2)
- Junit 跟XML解析实例
- Junit 学习笔记
- JUnit学习笔记
- • Junit学习笔记
- JUnit学习笔记
- Junit学习笔记
- Junit学习笔记1
- Junit学习笔记
- Junit学习笔记
- Junit学习笔记_1
- JUnit Gossip学习笔记
- 过滤器filter
- 一个标准的REST API测试代码
- Joel Spolsky的七个建议
- ASP过滤样式标签
- net的值类型与引用类型
- JUnit学习笔记2---解析controller实例代码
- 创建.lib文件及其使用
- 程序物语(八):我心戚戚
- 自动建表
- 英文centos 5安装中文语言包
- java中的全局变量与局部变量
- 用户体验到底有多重要?——说在支付宝年会后
- php 数组遍历 Warning: Invalid argument supplied for foreach()
- Discuz! 7.0改进之论坛任务