junit使用stub进行单元测试

小编 2026-06-05 阅读:889 评论:0
stub是代码的一部分,我们再对某一方法做单元测试时,可能涉及到调用第三方web服务。假如当前改服务不存在咋办?好办,写一段stub代码替代它。 下面演示一个例子,利用jetty相关的stub充当web服...

stub是代码的一部分,我们再对某一方法做单元测试时,可能涉及到调用第三方web服务。假如当前改服务不存在咋办?好办,写一段stub代码替代它。

下面演示一个例子,利用jetty相关的stub充当web服务器,返回适当内容。

关于jetty服务器,对比tomcat更轻量级,可轻松嵌入java代码启动它。

如何在项目中启动一个jetty服务器?

package com.lhy.junitkaifa.stubs;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.ResourceHandler;

/**
 * @author xusucheng
 * @create 2018-12-20
 **/
public class JettySample {
    public static void main(String[] args) throws Exception {
        Server server = new Server( 8081 );

        ContextHandler context = new ContextHandler(server,\"/\");
        //默认为项目根目录
        context.setResourceBase(\".\");
        context.setHandler(new ResourceHandler());

        server.setStopAtShutdown( true );
        server.start();
    }
}

请求:http://localhost:8081

\"\"

 

 

编写一个获取url内容的工具方法叫WebClient

package com.lhy.junitkaifa.stubs;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 读取指定URL内容
 * @author xusucheng
 * @create 2018-12-20
 **/
public class WebClient {
    public String getContent( URL url )
    {
        StringBuffer content = new StringBuffer();
        try
        {
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput( true );
            InputStream is = connection.getInputStream();
            byte[] buffer = new byte[2048];
            int count;
            while ( -1 != ( count = is.read( buffer ) ) )
            {
                content.append( new String( buffer, 0, count ) );
            }
        }
        catch ( IOException e )
        {
            return null;
        }
        return content.toString();
    }

    public static void main(String[] args) throws Exception{
        WebClient wc = new WebClient();
        String content = wc.getContent(new URL(\"http://www.baidu.com/\"));

        System.out.println(content);
    }
}

 

编写测试类TestWebClient

package com.lhy.junitkaifa.stubs;

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.ByteArrayISO8859Writer;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.http.HttpHeaders;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;

/**
 * @author xusucheng
 * @create 2018-12-20
 **/
public class TestWebClient {
    private WebClient client = new WebClient();
    private static final int PORT=8081;

    @BeforeClass
    public static void setUp() throws Exception{
        System.out.println(\"====================Befor Class=====================\");

        Server server = new Server(PORT);
        TestWebClient t = new TestWebClient();

        ContextHandler contentOkContext = new ContextHandler(server,\"/testGetContentOk\");
        contentOkContext.setHandler(t.new TestGetContentOkHandler());

        ContextHandler contentErrorContext = new ContextHandler(server,\"/testGetContentError\");
        contentErrorContext.setHandler(t.new TestGetContentServerErrorHandler());

        ContextHandler contentNotFoundContext = new ContextHandler(server,\"/testGetContentNotFound\");
        contentNotFoundContext.setHandler(t.new TestGetContentNotFoundHandler());

        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { contentOkContext, contentErrorContext, contentNotFoundContext});
        server.setHandler(handlers);

        server.setStopAtShutdown( true );
        server.start();
    }

    @Test
    public void testGetContentOk()
            throws Exception
    {
        String result = client.getContent( new URL( \"http://localhost:\"+PORT+\"/testGetContentOk\" ) );
        assertEquals( \"It works\", result );
    }

    @Test
    public void testGetContentError()
            throws Exception
    {
        String result = client.getContent( new URL( \"http://localhost:\"+PORT+\"/testGetContentError/\" ) );
        assertNull( result );
    }

    @Test
    public void testGetContentNotFound()
            throws Exception
    {
        String result = client.getContent( new URL( \"http://localhost:\"+PORT+\"/testGetContentNotFound\" ) );
        assertNull( result );
    }

    @AfterClass
    public static void tearDown()
    {
        // Do nothing becuase the Jetty server is configured
        // to stop at shutdown.
        System.out.println(\"====================After Class=====================\");
    }

    /**
     * 正常请求处理器
     */
    private class TestGetContentOkHandler
            extends AbstractHandler
    {

        @Override
        protected void doStart() throws Exception {
            super.doStart();
        }

        @Override
        public void setServer(Server server) {
            super.setServer(server);
        }

        @Override
        public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException, ServletException {
            System.out.println(\"======================TestGetContentOkHandler=======================\");
            OutputStream out = response.getOutputStream();
            ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer();
            writer.write( \"It works\" );
            writer.flush();
            response.setIntHeader( HttpHeaders.CONTENT_LENGTH, writer.size() );
            writer.writeTo( out );
            out.flush();
            request.setHandled(true);
        }
    }

    /**
     * 异常请求处理器
     */
    private class TestGetContentServerErrorHandler
            extends AbstractHandler
    {
        @Override
        public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException, ServletException {
            response.sendError( HttpServletResponse.SC_SERVICE_UNAVAILABLE );
        }
    }

    /**
     * 404处理器
     */
    private class TestGetContentNotFoundHandler
            extends AbstractHandler
    {

        @Override
        public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException, ServletException {
            response.sendError( HttpServletResponse.SC_NOT_FOUND );
        }
    }
}

 

直接运行该类,结果为:

\"\"

 

 

 

 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表