夜神模拟器模拟安卓测试_使用模拟进行测试

夜神模拟器模拟安卓测试

如果使用正确的方法,模拟对象将非常有用。 我在需要驱动软件开发使用的帖子中分享了一些使用Mock Objects的经验。

在这篇文章中,我分享了两件事
–使用模拟进行基于合同的测试。
–用于组织模拟代码的模式。

基于合同的测试

让我们以正在构建汇款服务的场景为例。 此类服务的关键组件是货币转换器,银行服务和外汇服务。

50000英尺的虚拟外汇服务设计如下所示。

我们必须编写需要货币换算和银行转账服务的外汇服务。
这是基于接触的测试的理想方案。

FXService的代码段

public class FXService {private final CurrencyConverter currencyConverter;private final BankService bankService;private final double commissionPer;public String transfer(Money money, BankAccount destinationAccount, Currency target) {String sourceCurrency = money.currency().name();String targetCurrency = target.name();double commissionAmount = calculateCommission(money.amount());double fxRate = currencyConverter.convert(1, sourceCurrency, targetCurrency); // First interaction  double transferAmount = calculateTransferAmount(money, commissionAmount);double totalAmount = applyFxRate(transferAmount, fxRate);String transactionId = bankService.deposit(totalAmount, destinationAccount); // Second interaction return transactionId;}
}

我们新的外汇服务必须遵循以下合同

  • 根据输入/输出合同与货币转换器和银行转账进行交互。
  • 对每个服务进行1次呼叫。

测试FX服务的一种方法是调用真实服务,但这意味着测试运行缓慢,并且在执行测试时必须依赖于服务。 有时调用实时服务不是一种选择,因为它尚未开发。

聪明的方法是模拟这些合作者(货币转换器和银行转账)并使用模拟框架验证交互。

使用模拟进行测试的另一个优点是,它可以验证fxservice是否以预期的方式使用了货币和银行转账服务。

让我们看一下基于模拟的测试。

@Testpublic void transfer_sgd_to_inr() {FXService fxService = new FXService(currencyConverter, bankService, 0.0d);BankAccount account = new BankAccount("1111-22222", "SuperStableBank");expect(currencyConverter.convert(1, "SGD", "INR")).andReturn(50d);expect(bankService.deposit(100d, account)).andReturn("99999");replay(currencyConverter, bankService);String id = fxService.transfer(new Money(SGD, 2d), account, INR);assertEquals("99999", id);verify(currencyConverter, bankService);}

该测试是使用EasyMock框架编写的,并且是模拟来自协作者的答复。

编写要阅读的测试

良好测试的重要属性之一是阅读愉快。

嘲弄会使目标更加难以实现,因为用于单元测试的安装代码将具有非常复杂的组装逻辑,这些逻辑将混合一些常规对象集和某些模拟期望。 我确定您已经在测试中看到过功能,该功能可用作类中所有测试所需的设置的转储场。

让我们看一下我们先前使用的一些模拟代码,并尝试对其进行改进

expect(currencyConverter.convert(1, "SGD", "INR")).andReturn(50d);
expect(bankService.deposit(100d, account)).andReturn("99999");
replay(currencyConverter, bankService);

其他方式

@RegisterExtension
JUnit5Mockery context = new JUnit5Mockery();context.checking(new Expectations() {{oneOf(currencyConverter).convert(1, "SGD", "INR");will(returnValue(50d));oneOf(bankService).deposit(100d, account);will(returnValue("99999"));}});

上面的两个代码都在做同样的事情,但是后来用jmock编写的代码具有很好的糖方法来表达同样的事情。
这有助于使期望保持清洁,并与正在测试的代码保持一致。 上下文中的协作对象被模拟出来。
简单的模式,但在使测试可读性方面非常有效。

这篇文章中使用的代码可以在github上找到

翻译自: https://www.javacodegeeks.com/2020/04/testing-using-mocks.html

夜神模拟器模拟安卓测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java记录类型_Java中的记录类型

java记录类型于2020年3月发布的JDK 14引入了记录 (预览语言功能),该记录提供了一种紧凑的语法来声明主要用于保存数据的类。 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访问器和通用方法&a…

代理模式(多线程实现状态监控)

【-1】README-1.1)本文部分文字描述转自“head first 设计模式”,旨在学习 远程代理对象 的基础知识;-1.2)多线程实现糖果自动售卖机监控程序为原创;-1.3)博文最后,转载了代理模式的定义&#…

一篇文章搞定面试中的二叉树

转载自 IOExceptioner 算法与数据结构 在上一篇介绍二叉树( Android面试题算法之二叉树 、红黑树详细分析,看了都说好),没看的读者建议先去了解了解,接下来再给大家带来一篇关于二叉树的文章。 最近总结了一些数据结…

清洁代码_清洁单元测试

清洁代码编写使用JUnit和某些模拟库的“单元测试”测试很容易。 即使测试甚至不是单元测试并提供可疑的价值,它们也可能产生使某些涉众满意的代码覆盖范围。 编写单元测试(在理论上是单元测试,但是比基础代码更复杂)因此也很容易编…

jvm(6)-Class字节码文件结构总结

【0】README 0.1)本文总结于 Clas字节码文件,旨在理清 Class字节码文件的大体结构; 【1】干货开始 对上图的分析(Analysis):A1)offset0 A1.1)头四个字节为CAFEBABE:表示…

Android面试题算法之二叉树

转载自 qing的世界 程序员小乐文章目录 前言二叉树的递归(深度优先)处理二叉树的层序处理(广度优先)总结“一、前言今年可谓是跌宕起伏的一年,幸好结局还算是圆满。开年的时候由于和公司CTO有过节,被"打入冷宫"&#…

java 读取 文本块_Java文本块

java 读取 文本块文本块是JDK增强建议( JEP 355 ),可以在JDK 13和14中用作预览语言功能。它计划在JDK 15中成为永久性功能。文本块是跨越多行并且不需要的String文字。对于大多数转义序列。 动机 在标准Java字符串中嵌入XML,JSON…

代理模式之虚拟代理(仅了解)

【0】README0.1)本文全文转自 “head first 设计模式”,旨在了解 虚拟代理动态代理;0.2)晚辈我 java.swing 烂到渣,没有写出干货荔枝,抱歉;【1】虚拟代理简述1)远程代理:…

红黑树详细分析

转载自 coolblog 算法与数据结构“一、红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert…

rest api如何创建_REST:创建资源

rest api如何创建资源创建是常见的REST API操作。 在这篇文章中,我们将看到如何创建单个资源。 客户要求 通常,通过将POST请求发送到父集合资源来创建资源。 这将使用新生成的ID创建一个新的下属资源。 例如,对/ projects的POST请求可用于在…

java字节码指令简介(仅了解)

【0】README0.1)本文全文转自 “深入理解jvm”, 旨在了解 java字节码指令 的基础知识;【1】写在前面1)由于jvm 采用面向操作数栈而不是寄存器的结构,所以大多数的指针都不包含操作数,只有一个操作码&#x…

什么是 CAS 机制

转载自 永远爱大家的 程序员小灰示例程序:启动两个线程,每个线程中让静态变量count循环累加100次。最终输出的count结果是什么呢?一定会是200吗?加了同步锁之后,count自增的操作变成了原子性操作,所以最终…

java xmpp_Java XMPP负载测试工具

java xmpp在本文中,我们将开发用Java编写的XMPP负载测试工具。 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1。 创建一个新的Maven项目 4.2。 创建主类 4.3。 XmppManager类 4.4。 建立 4.5。 负载测试 5.总结 6.参考 7.下载Maven项目…

jvm(7)-虚拟机类加载机制

【0】README0.1)本文转自“深入理解jvm”,旨在学习 虚拟机类加载机制 的基础知识;【1】概述1)类加载机制:虚拟机把描述类的数据从Class 文件加载到内存,并对数据进行校验,转换解析和初始化&…

什么是CAS机制?(进阶篇)

转载自 永远爱大家的 程序员小灰 这一期我们来深入介绍之前遗留的两个问题: Java当中CAS的底层实现 CAS的ABA问题和解决方法 首先看一看AtomicInteger当中常用的自增方法 incrementAndGet: public final int incrementAndGet() {for (;;) {int cur…

c++ 前缀 变量命名_前缀命名

c 前缀 变量命名如果您是第一次查看Takes或Cactoos的源代码,很可能会像其他命名约定一样被命名约定触发,这意味着大多数类名都有两个字母的前缀: BkSafe , RqFake , RsWithStatus , TkGzip等。 老实说&…

jvm(8)-虚拟机字节码执行引擎

【0】README0.1)本文转自 “深入理解jvm”,旨在学习 虚拟机字节码执行引擎 的基础知识;【1】概述1)物理机和虚拟机的执行引擎: 物理机的执行引擎是直接建立在处理器,硬件,指令集和操作系统层面上…

什么是大数据

转载自 玻璃猫 程序员小灰大数据是具有海量、高增长率和多样化的信息资产,它需要全新的处理模式来增强决策力、洞察发现力和流程优化能力。Big data is high volume, high velocity, and/or high variety information assets that require new forms of processing…

java 记录考勤记录_Java 14:记录

java 记录考勤记录Java 14是在几周前问世的,它引入了Record类型,它是一个不变的数据载体类,旨在容纳一组固定的字段。 请注意,这是一种预览语言功能 ,这意味着必须使用--enable-preview标志在Java编译器和运行时中显式…

漫画:什么是HashMap

转载自 玻璃猫 程序员小灰众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。 HashMap数组每一个元素的初始值都…