junit使用stub进行单元测试

Win11 WSL2 Ubuntu 18.04 ROS Gazebo 图形渲染性能调优:从LLVM到NVIDIA GPU的完整指南 本文详细解决了在Win11 WSL2 Ubuntu 18.04环境中运行ROS Gazebo时图形渲染卡顿的问题。通过诊断默认LLVM软件渲染的瓶颈,指导用户更新Mesa驱动PPA源,并关键性地设置环境变量以强制启用NVIDIA GPU硬件加速,最终显著提升仿真性能与流畅度。 阅读详情

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

stub 技术就是把某一部分代码与环境隔离起来(比如,通过替换 Web服务器、文件系统、数据库等手段)从而进行单元测试的。

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

环境: idea + spring boot + jetty

关于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 );
        }
    }
}

 

直接运行该类,结果为:

 

 

 

 

基于DFT的scanshift sdc模板(DFT) 摘要:本文详细介绍了DFT测试模式下的SDC约束方法。 阅读详情

相关推荐

FFTW3库在Windows中的安装和使用

Windows 32位平台下载:FFTW Installation on Windows。

weixin_45397344的博客 951

初识stub和mock--junit的两种测试策略

JUnit相信大家都在用,对于如何使用Junit这里不在赘述。Stub和Mock就是两种协助Junit测试的思想或者策略,它们并不是真实存在的对象,却可以模拟真实对象的状态和交互。

直冲云霄的小鸟 6467

【2026年阿里巴巴集团暑期实习- 4月25日-算法岗-第二题- 矩阵计数】(题目+思路+Java&C++&Python解析+在线测试)

摘要: 给定两个非负整数序列a和b,构造n×m矩阵C,其中C[i][j]=a[i]×b[j]。统计矩阵中元素≥k的数量。解法是先对数组b排序,然后对于每个a[i],若k=0则直接累加m;若a[i]=0且k>0则跳过;否则计算需要的最小b[j]值,在排序后的b中使用二分查找确定满足条件的元素数量。时间复杂度为O((n+m)log m),空间复杂度O(1)。代码实现了排序和二分查找的高效组合。

m0_73659489的博客 65

JAVA--WebClient

如果要访问的URL都来自同一个应用,只是对应不同的URL地址,这个时候可以把公用的部分抽出来定义为baseUrl,然后在进行WebClient请求的时候只指定相对于baseUrl的URL部分即可。与相比retrieve(),当使用时exchange(),应用程序有责任使用任何响应内容,而不管情况如何(成功,错误,意外数据等),否则会导致内存泄漏.也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》PDF,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

huang714的专栏 4056

Python爬虫教程:抓取Android或iOS应用中的数据

随着智能手机的普及,移动应用程序已经成为我们生活中不可或缺的一部分。从社交媒体、在线购物到金融服务和健康管理,几乎所有领域都有相应的手机应用程序(App)服务用户。而这些应用程序通常会存储大量的数据,例如用户行为、产品信息、订单记录等。如果我们能有效地抓取这些数据,可以为数据分析、商业智能、用户行为分析等提供有力支持。本文将重点介绍如何使用Python爬虫技术抓取Android或iOS应用中的数据,尤其是如何从这些应用的后端接口、存储、或网页中提取数据。我们将探讨如何通过反向工程技术访问移动应用中的API接

2201_76125261的博客 802

Claude Code 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例展示如何使用 Claude Code 配合 Python 的 `ezdxf` 库,从零开始生成专业级 CAD 机械图纸。我们将绘制一个完整的法兰盘零件图,包含主视图、俯视图、标注尺寸、粗糙度标记和标题栏,最终生成标准 DXF 文件,可直接在 AutoCAD 或 FreeCAD 中打开编辑。

yueyeguzhuo的专栏 897

【测试】Webflux的Junit单元测试

本年度公司框架将加入WebFlux作为Reactive交互技术(传统模式还会保留)。WebFlux是基于Netty,在交互上采用的是异步处理模式,这次加入Webflux是希望增强框架的交互多样性和容载能力。 Webflux的具体实现将不在这里细说,本次主要讲解一下通过Junit调用Webflux遇到的“坑”。 spring-boot-starter-webflux 和 spring-boot-starter-web 同时引入不生效的问题。 通过官网的说明不难发现 旧版Web包使用的是阻塞结构,而Webfl

Kida 的躺平小屋 1614

【系统分析师】写作框架:软件设计模式及其应用

本文围绕"软件设计模式及其应用"展开论述。首先介绍了近三年参与的某软件开发项目背景及个人承担的系统设计工作。其次系统阐述了设计模式的三大分类:创建型(如工厂方法、单例模式)、结构型(如适配器、装饰器模式)和行为型(如观察者、策略模式),重点分析了各类模式的特点和典型应用场景。最后结合项目实践,详细说明了采用的三种设计模式的具体实施过程及效果,包括提高代码复用性、降低耦合度等优势。文章还总结了项目经验,指出存在的不足及改进方向,强调合理运用设计模式对构建高质量软件系统的重要性。全文通过理论

数据知道的博客 5062

单元测试探析:什么是Stubs、Mocks、Spies、Dummies?带你了解4个核心工具

我经常看到开发人员通过启动一个“测试数据库”来编写与数据库交互的代码的测试,其中测试可以触发“写入”并通过查询数据库进行验证,我认为这是错误的。Stubs可以帮助你处理这些情况,即你的代码与第三方服务进行交互。无论是数据库、API还是硬盘上的文件,stubs都提供了使用更简单版本的服务的代码。这个Stub会返回一个已知的、可控的值。例如,如果你正在测试一个向数据库写值的函数,你应该编写一个Stub,避免与数据库的交互,但返回一个成功的结果。通过这个,你就可以测试当写入操作工作时发生了什么。

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 2203

如何创建 SAP ABAP CDS View 的 Association

所以本文我们虽然学习了如何创建 SAP CDS View 的 association,知道了 association 是用来在 CDS View 里将两张数据库表关联起来,但根本不知道怎么使用这个 association. 而且从 association 的写法来看,似乎和本教程之前介绍 inner join,left join 这些数据库表的连接操作没什么区别,都是根据两张表的 carrid 和 connid 字段相同进行的连接。只看到了我们在 CDS View 源代码实现里,放出来的四个字段。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 904

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 116

Spring 5 WebClient和WebTestClient使用教程 原 leftso

1.引言 Spring开发人员,您是否曾经觉得需要一个易于使用且高效的流畅功能样式 API 的异步/非阻塞 HTTP客户端? 如果是,那么我欢迎您阅读关于WebClient的文章,WebClient是Spring 5中引入的新的被动HTTP客户端。   2.如何使用WebClient WebClient是Spring 5的反应性Web框架Spring WebFlux的一部分。要使用WebC...

HiBoyljw的博客 5532

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java单元测试(Junit+Mock+代码覆盖率)

转自:https://yq.aliyun.com/articles/234053 单元测试是编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的。 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性。 一般来说,单元测试任务包括 接口功能测试:用来保证接口功能的正确性。 局部数据结构测试...

xiaoxiaoyusheng2012的专栏 926

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Junit java.lang.RuntimeException: Stub!

问题在 Android 项目下用 Junit 写单元测试,调用到 android.jar 中的类时,会出现 java.lang.RuntimeException: Stub! 错误。e.g: public class JsonHelperTest { private JsonHelper jsonHelper; @Before public void setUp(){

Abner-L 5798

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java笔试面试题AI答之单元测试JUnit(7)

功能:JUnit 5 引入了一套强大的扩展模型,允许开发者通过编写扩展来增强测试功能。例如,可以创建自定义注解来控制测试的执行、收集测试结果等。适用场景:根据具体测试需求进行定制化开发。JWebUnit是基于Java的Web应用程序的测试框架,它融合了JUnit与HttpUnit的优点,为开发者提供了丰富的测试断言和页面导航功能。JWebUnit旨在简化Web应用程序的测试过程,通过包装现有的测试框架如HtmlUnit和Selenium,提供了一个统一的、简单的测试界面。

学无止境,止于至善 2242

Java单元测试之JUnit4详解

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33724046的博客 624

JUnit+Mockito单元测试之打桩when().thenReturn();

什么是Mock 测试 Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取的对象(如 JDBC 中的ResultSet 对象,JPA的CRUDRepository,需要执行数据库操作的),用一个虚拟的对象(Mock 对象)来创建(覆盖方法返回)以便测试的测试方法。 JUnit 是一个单元测试框架。 ...

★【World Of Moshow 郑锴】★ 4万+

java存根_如何在JUnit和Java中使用存根?

我曾经使用过JUnit和Mocks,但我想知道,JUnit中的Mocks和Stub之间有什么区别,以及如何在JUnit,Java中使用Stub?作为具有EasyMock,Mockito等的Mocks,Stubs在Java中使用什么?请提供Java中的存根示例代码。希望这个答案对您有帮助香港专业教育学院以前读过,并没有帮助:(提问者有责任提供示例代码和他们已完成的现有研究。 这个问题需要改进。我认为...

weixin_39878698的博客 280

软件测试技术之单元测试—工程师 Style 的测试方法(2)

其开发过程是从功能需求的test case开始,先添加一个test case,然后运行所有的test case看看有没有问题,再实现test case所要测试的功能,然后再运行test case,查看是否有case失败,然后重构代码,再重复以上步骤。即使我们写的是广义的单元测试,它依然可能依赖其他模块,比如其他类的方法、第三方服务调用或者数据库查询等等,造成我们无法很方便的测试被测系统或模块。所以,我们可以通过传入不同的用户 ID,让契约 Stub 返回不同状态的用户数据,从而验证不同的处理流程。

xuezhangmen的博客 1378
上一篇: junit运行Parameterized参擞化测试
下一篇: junit使用mock objects进行单元测试
罗汉爷
罗汉爷 新星创作者: Java技术领域 新星创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 4912粉丝 605原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值