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/