JUnit学习笔记2---解析controller实例代码

昨晚未进行代码部分的解析,现在呈现一下组件测试的简单例子:

组件代码:

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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值