百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

使用mock进行单元测试 java中mock单元测试写法

haoteby 2024-12-15 13:13 57 浏览

在service层,使用mock来测试代码。而不再使用Juint测试

JUint是java单元测试的框架,已经在Eclipse中默认的安装。目前主流的有JUnit3和JUnit4.JUint3中,测试用例需要继承TestCase类,JUint4中,测试用例无需继承TestCase类,只需要使用@Test等注解。

JUint4主要通过注解的方式来识别测试方法。目前支持的主要注解有:

@BeforeClass全局只会执行一次,而且是第一个运行。

@Before在测试方法运行之前运行

@Test测试方法

@After在测试方法运行之后允许

@AfterClass全局只会执行一次,而且是最后一个运行

@Ignore忽略此方法

Juint3和JUint4都提供了一个Assert类。Assert类中定义了很多静态方法来进行断言。

Mockito与JUint不同,并不是单元测试框架。它是用于生成模拟对象或者直接点说,就是“假对象”的工具。

Mock/Stub

Mock和Stub是两种测试代码功能的方法。Mock侧重于对功能的模拟,Stub测重于对功能的测试重现,例如对List接口。Mock会直接对List进行模拟,而Stub会新建一个实现了List的TestList,在其中编写测试的代码。

强烈建议优先选择Mock方式,因为Mock方式下,模拟代码与测试代码放在一起,易读性好,而且扩展性、灵活性都比Stub好。

比较流行的Mock

JMock

EasyMock

Mockito

powermock

其中EasyMcock和Mocking对于Java接口使用接口代理的方式来模拟。对于Java类使用继承的方式来模拟(即会创建一个新的Class类)。Mockito支持spy方式。可以对实例进行模拟。但他们都不能对静态方法和final类进行模拟。

Mockito是一个开源项目。Api相对于EasyMock更友好,与EasyMock不同的是,Mockito没有录制过程,只需要在“运行测试代码”之前对接口进行Stub,即设置方法的返回值或抛出的异常。然后直接运行测试代码。运行期间调用Mock的方法,会返回预先设置的返回值或抛出异常。最后再对测试代码进行验证。

  1. mport static org.mockito.Mockito.*;

  2. //创建Mock
  3. List mockedList = mock(List.class);

  4. //使用Mock对象
  5. mockedList.add("one");
  6. mockedList.clear();

  7. //验证行为
  8. verify(mockedList).add("one");
  9. verify(mockedList).clear();

首先是配置 Mock 对象,、

  1. List mock = mock( List.class );
  2. when( mock.get(0) ).thenReturn( 1 );
  3. assertEquals( "预期返回1", 1, mock.get( 0 ) );

Mockito支持 迭代风格 的返回值设定,

  • 第一种方式 when(i.next()).thenReturn("Hello").thenReturn("World");
  • 第二种方式 when(i.next()).thenReturn("Hello", "World");

上面的例子等价于:

 when(i.next()).thenReturn("Hello");

when(i.next()).thenReturn("World");

第一次调用i.next()将返回”Hello”,第二次的调用会返回”World”。

对 void 方法不返回值,所以不能 when(mock.someMethod()).thenReturn(value) 这样的语法,可以这样

 doNothing().when(i).remove();

doThrow(Throwable) 模拟返回异常

doThrow(new RuntimeException()).when(i).remove();

迭代风格 doNothing().doThrow(new RuntimeException()).when(i).remove();,这样,第一次调用remove方法什么都不做,第二次调用抛出RuntimeException异常。

(1)如何将mock的类自动注入到待测类中?

在测试代码中,使用@Inject将service层注入,@Mock注释Mapper。

public class AService {

}

public class AServiceTest extends Test4J{

@Inject(targets= { “ AService” })

@Mock

private AMapper aMapper;

}

相关推荐

如何为MySQL服务器和客户机启用SSL?

用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...

OpenVPN客户端配置_openvpn客户端配置文件解析

...

k8s 证书问题排查_k8s dashboard 证书

从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...

企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战

企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...

OpenV** Server/Client配置文件详解

Server配置详解...

接口基础认知:关键信息与合规前提

1.核心技术参数(必记)...

S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)

说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...

SSL证书如何去除私钥密码保护_ssl证书怎么取消

有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...

SSL证书基础知识与自签名证书生成指南

一、证书文件类型解析...

S交换机通过SSH登录设备配置示例(RADIUS认证)

说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...

HTTPS是什么?加密原理和证书。SSL/TLS握手过程

秘钥的产生过程非对称加密...

HTTPS TLS握手流程_进行tls握手

1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....

Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt

SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...

源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章

在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...

微信支付商户API证书到期 怎么更换

微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...