Request:

public interface Request {
    String getName();
}

Response:

public interface Response {
    String getName();
}

RequestHandler:

public interface RequestHandler {
    Response process(Request request) throws Exception;
}

Controller:

public interface Controller {
    Response processRequest(Request request);

    void addHandler(Request request, RequestHandler requestHandler);
}

DefaultController:

import java.util.HashMap;
import java.util.Map;

public class DefaultController implements Controller{

    /*
        如果这个地方指明了RequestHandler的,可能会遇到一些泛型方面的问题。
        指明了RequestHandler,我能够将RequestHandler的子类放进这个map
        中么?

        这个地方我忘了,估计那部分还需要再阅读一遍
     */
    private Map<String,RequestHandler> requestHandlers = new HashMap<String, RequestHandler>();

    protected RequestHandler getHander(Request request) {
        if (!this.requestHandlers.containsKey(request.getName())) {
            String msg = "Can't find handler for request name.";
            throw new RuntimeException(msg);
        }
        return requestHandlers.get(request.getName());
    }

    public Response processRequest(Request request) {
        Response response;
        try{
            response = getHander(request).process(request);
        } catch (Exception e) {
            response = new ErrorResponse(request, e);
        }
        return response;
    }

    public void addHandler(Request request, RequestHandler requestHandler) {
        if (this.requestHandlers.containsKey(request.getName())) {
            String msg = "A request handler handler has "+
                    "already been registered for request "+
                    "["+request.getName()+"].";
            throw new RuntimeException(msg);
        }else {
            requestHandlers.put(request.getName(), requestHandler);
        }
    }
}

ErrorResponse:

public class ErrorResponse implements Response {
    private String name = "ErrorResponse";
    private Request originalRequest;
    private Exception originalException;

    public ErrorResponse(Request originalRequest, Exception originalException) {
        this.originalRequest = originalRequest;
        this.originalException = originalException;
    }

    public Request getOriginalRequest() {
        return originalRequest;
    }

    public Exception getOriginalException() {
        return originalException;
    }

    public String getName() {
        return name;
    }
}

DefaultControllerTest:

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

import static org.junit.Assert.*;

public class DefaultControllerTest {

    private DefaultController controller;
    private Request request;
    private RequestHandler handler;

    @Before
    public void instantiate() throws Exception{
        controller = new DefaultController();
        request = new SimpleRequest();
        handler = new SimpleRequestHandler();

        controller.addHandler(request, handler);
    }

    @Test
    public void testAddHandler(){
        RequestHandler handler2 = controller.getHander(request);
        assertSame("Should be same.",handler,handler2);
    }

    @Test
    public void testProcessRequest() {
        Response response = controller.processRequest(request);
        assertNotNull("Should not be null",response);
        assertEquals("shoue be same", new SimpleResponse(), response);
    }

    /*
        书上这部分有点乱,我只能自己来设计各个测试了,前面已经完成了
        诊断测试,现在主要完成各个异常测试:
            1.测试addHandler方法抛出的异常
            2.测试getHandler方法抛出的异常
            3.测试process方法抛出的异常,由于process方法的异常
                被DefaultController的processRequest方法给
                捕获了,所以需要测试processRequest返回的错误
                消息。
     */
    @Test
    public void testProcessAnswerErrorResponse(){
        SimpleRequest request = new SimpleRequest("testError");
        SimpleExceptionHandler handler = new SimpleExceptionHandler();
        controller.addHandler(request,handler);
        Response response = controller.processRequest(request);

        assertNotNull("Should not be noll", response);
        assertEquals("Should be the same.", ErrorResponse.class,response.getClass());
    }

    @Test(expected = RuntimeException.class)
    public void testGetHandlerNotDefined() {
        SimpleRequest request = new SimpleRequest("testNotDefined");

        controller.getHander(request);
    }

    @Test(expected = RuntimeException.class)
    public void testAddHandlerDuplicateName() {
        SimpleRequest request = new SimpleRequest();
        SimpleRequestHandler handler = new SimpleRequestHandler();

        controller.addHandler(request,handler);
    }

    /*
        测试超时
     */
    @Test(timeout = 130)
    @Ignore(value = "no need not.")
    public void testProcessMultipleRequestsTimeout() {
        Request request;
        Response simpleResponse = new SimpleResponse();
        SimpleRequestHandler handler = new SimpleRequestHandler();

        for (int i = 0; i < 99999; i++) {
            request = new SimpleRequest();
            controller.addHandler(request, handler);
            simpleResponse = controller.processRequest(request);
            assertNotNull(simpleResponse);
            assertNotSame(ErrorResponse.class,simpleResponse.getClass());
        }
    }

    private class SimpleRequest implements Request {

        private static final String NAME = "Test";

        private String name;

        public SimpleRequest(String name) {
            this.name = name;
        }

        public SimpleRequest() {
            this(NAME);
        }

        public String getName() {
            return name;
        }
    }

    private class SimpleResponse implements Response {

        private static final String NAME = "Test";

        public String getName() {
            return NAME;
        }

        @Override
        public boolean equals(Object obj) {
            boolean result = false;
            if (obj instanceof SimpleResponse) {
                result = ((SimpleResponse) obj).getName().equals(getName());
            }
            return result;
        }

        @Override
        public int hashCode() {
            return NAME.hashCode();
        }
    }

    private class SimpleRequestHandler implements RequestHandler {

        public Response process(Request request) throws Exception {
            return new SimpleResponse();
        }
    }

    private class SimpleExceptionHandler implements RequestHandler {

        public Response process(Request request) throws Exception {
            String msg = "error processing request";
            throw new Exception(msg);
        }
    }
}

《Junit实战》笔记

Junit初级应用实例的更多相关文章

  1. Appium + junit 的简单实例

    import static junit.framework.Assert.assertTrue; import static org.junit.Assert.*; import org.junit. ...

  2. Junit初级编码(二)探索JUnit核心

    序,Junit测试是单元测试的一个框架,提供了很多方法,供我们快速开展单元测试.现在就让我们慢慢学习Junit单元测试框架 一.Junit的三个核心概念测试类.测试集.测试运行器 1 测试类 公共的, ...

  3. Junit初级编码(一)第一个Junit测试程序

    序,Junit测试是单元测试的一个框架,提供了很多方法,供我们快速开展单元测试.目前最新版本JAR包为4.12,官网地址为http://junit.org/ 一.第一个Junit测试程序 1 去官网下 ...

  4. Junit单元测试的实例

    进行单元测试的代码 package JunitTest; import org.junit.Test; public class Calculator { private static int res ...

  5. JUnit套件测试实例

    “套件测试”是指捆绑了几个单元测试用例并运行起来.在JUnit中,@RunWith 和 @Suite 这两个注解是用来运行套件测试. 下面的例子演示这两个单元测试:JunitTest1 和 Junit ...

  6. Junit初级篇

    @Test介绍 @Test是我们在写测试脚本时最常用到的,大部分情况下如果没用这个注解,一个方法就不能成为测试用例.如下代码是一个最普通的测试脚本: import org.junit.Assert; ...

  7. [python][flask][flask-SQLAlchemy]关于flask-SQLAlchemy的初级使用教程

    鉴于网上关于flask-SQLAlchemy的实例使用教程参差不齐,于此写下工作学习过程中的使用过程,以便分享交流. 对于python关于flask有一定了解的高端玩家来说,请转至flask官方开发文 ...

  8. 菜鸟学Java(二十一)——怎样更好的进行单元測试——JUnit

    測试在软件生命周期中的重要性,不用我多说想必大家也都很清楚.软件測试有许多分类,从測试的方法上可分为:黑盒測试.白盒測试.静态測试.动态測试等:从软件开发的过程分为:单元測试.集成測试.确认測试.验收 ...

  9. 1.如何在JMeter中使用JUnit

    您是否需要在测试过程中使用JUnit? 要回答这个问题,我们先来看看单元测试. 单元测试是软件测试生命周期中测试的最低分辨率. 运行单元测试时,需要在应用程序中使用最小的可测试功能,将其与其他代码隔离 ...

随机推荐

  1. vista忘记用户名密码的修改方法(使用PE进入系统,用cmd.exe冒充虚拟键盘,然后就可以mmc组策略,或者命令行添加用户并提升权限)

    1. 准备Windows Vista安装光盘,进入BIOS将光驱设为第一启动,在出现的安装界面依次单击"修复计算机","命令提示符". 2.输入以下命令: co ...

  2. node应用远程调试教程

    远程调试 所谓远程调试,是指在本地IDE或命令行即时调试服务端代码,这在预发环境的测试阶段可以使用.远程调试避免了服务端环境的模拟,可快速定位bug. node应用调试 本文的教程主要针对采用 VS ...

  3. 主要C++流派,看看你是哪一流

    1. 经典C++流:类是核心,例程多用C Runtime的,很少用模版,一般是正统教育的结果.2. 古典C流:基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧.3. MFC流:秉承MFC的风格,主要使 ...

  4. WPF全局异常捕获

    跟着<WPF专业编程开发指南>这书打的代码的,自己在正式项目中测试通过,可以抓取到全局的异常,用的log4net来记录日志 核心代码: 写在App.xaml.cs中 /// <sum ...

  5. 虚拟机安装 ubuntu 后,更新源无效,以及无法联网安装软件的问题

    问题: 虚拟机安装 ubuntu 后,更新源无效,以及无法联网安装软件: 错误提示: Err http://security.ubuntu.com/ubuntu/ trusty-security/un ...

  6. Delphi开发 Android 程序启动画面简单完美解决方案

    原文在这里 还是这个方法好用,简单!加上牧马人做的自动生成工具,更是简单. 以下为原文,向波哥敬礼! 前面和音儿一起研究 Android 下启动画面的问题,虽然问题得到了解决,但是,总是感觉太麻烦,主 ...

  7. 界面美化.CStatic控件的美化(好多系列文章)

    http://www.cnblogs.com/20090802/archive/2010/09/17/1829283.html 静态控件也是比较常用的控件,在VS开发环境中用的应该挺频繁的吧. 其实m ...

  8. hadoop之文件管理基本操作

    # 格式化hdfs hadoop namenode -format # 查看hadoop下的文件夹 hadoop fs -ls # 创建hdfs文件夹 hadoop fs -mkdir /user/i ...

  9. Spring Boot:实现MyBatis动态创建表

    综合概述 在有些应用场景中,我们会有需要动态创建和操作表的需求.比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等.这个时候就需要我们动态的生成和操作数据库表了. ...

  10. zabbix-3.2.6安装部署

    一.准备一台虚拟机并安装centos7.x版本系统 二.配置zabbix_server 1.http install: #安装各类软件支持库 yum install apr-devel apr-uti ...