mockito_使用FizzBuzz和Mockito进行单元测试
mockito
我有时使用FizzBuzz向新手演示单元测试的基础。 尽管FizzBuzz确实是一个简单的问题,但是它也可以用于演示更高级的单元测试技术,例如模拟。
FizzBuzz Kata:
“编写一个程序,打印从1到100的数字。但是,对于三个数字的倍数,请打印“ Fizz”,而不是数字;对于五个数字的倍数,请打印“ Buzz”。 对于三和五的倍数的数字,请打印“ FizzBuzz ”。
FizzBuzz算法的可能解决方案:
public class FizzBuzz {private static final int FIVE = 5;private static final int THREE = 3;public String calculate(int number) {if (isDivisibleBy(number, THREE) && isDivisibleBy(number, FIVE)) {return "FizzBuzz";}if (isDivisibleBy(number, THREE)) {return "Fizz";}if (isDivisibleBy(number, FIVE)) {return "Buzz";}return "" + number;}private boolean isDivisibleBy(int dividend, int divisor) {return dividend % divisor == 0;}
}
由于上面的代码解决了FizzBuzz算法,因此无法解决FizzBuzz问题。 要完成它,我们需要使用该算法的代码来打印从1到100的数字。 代码的这一部分可以用来展示使用Mockito在JUnit中进行模拟的想法。
作为此练习的结果,我最终得到了一个NumberPrinter
,它带有两个参数: Printer
和NumberCalculator
并且具有一个公共方法来打印数字:
public class NumberPrinter {private NumberCalculator numberCalculator;private Printer printer;public NumberPrinter(NumberCalculator numberCalculator, Printer printer) {this.numberCalculator = numberCalculator;this.printer = printer;}public void printNumbers(int limit) {if (limit < 1) {throw new RuntimeException("limit must be >= 1");}for (int i = 1; i <= limit; i++) {try {printer.print(numberCalculator.calculate(i));} catch (Exception e) {// noop}}}
}public interface NumberCalculator {String calculate(int number);
}public interface Printer {void print(String s);
}
引入接口后,我不仅拥有可测试的代码,而且拥有更强大的代码。 为了测试NumberPrinter
我只是使用Mockito的强大功能和简单性来模拟依赖项。 使用Mockito批注,配置测试代码的读取效果更好。
Mockito功能演示:
- 创建和注入模拟
- 存根方法还可以为连续的方法调用设置不同的行为。
- 将void方法存入一个异常
- 验证
使用的注释:
@RunWith(MockitoJUnitRunner.class)
–在每个测试方法之前初始化@Mock
@Mock
–将字段标记为模拟@InjectMocks
–标记应在其上执行注射的字段
@RunWith(MockitoJUnitRunner.class)
public class NumberPrinterTest {@Mockprivate Printer printer;@Mockprivate NumberCalculator numberCalculator;@InjectMocksprivate NumberPrinter numberPrinter;@Testpublic void printsCalculatorResultsHundredTimes() {// arrangeint limit = 100;when(numberCalculator.calculate(anyInt())).thenReturn("0") // first invocation returns "0".thenReturn("1"); // other invocations return "1"// actnumberPrinter.printNumbers(limit);// assertverify(numberCalculator, times(limit)).calculate(anyInt());verify(printer, times(1)).print("0");verify(printer, times(limit - 1)).print("1");verifyNoMoreInteractions(numberCalculator, printer);}@Testpublic void continuesOnCalculatorOrPrinterError() {// arrangewhen(numberCalculator.calculate(anyInt())).thenReturn("1").thenThrow(new RuntimeException()).thenReturn("3");// stub the void method with an exceptiondoThrow(new RuntimeException()).when(printer).print("3");// actnumberPrinter.printNumbers(3);// assertverify(numberCalculator, times(3)).calculate(anyInt());verify(printer).print("1");verify(printer).print("3");verifyNoMoreInteractions(numberCalculator, printer);}
}
享受Mockito !
- 想更多地了解Mockito注释? 看看Eugen Paraschiv的“ Mockito – @ Mock,@ Spy,@ Captor和@InjectMocks”: http : //www.baeldung.com/mockito-annotations
- 寻找代码样本? 看一下介绍单元测试不同方面的unit-testing-demo项目,包括模拟: https : //github.com/kolorobot/unit-testing-demo
翻译自: https://www.javacodegeeks.com/2014/11/unit-testing-exercise-with-fizzbuzz-and-mockito.html
mockito
mockito_使用FizzBuzz和Mockito进行单元测试相关推荐
- mockito 单元测试_使用FizzBuzz和Mockito进行单元测试
mockito 单元测试 我有时使用FizzBuzz向新手演示单元测试的基础. 尽管FizzBuzz确实是一个简单的问题,但它也可以用于演示更高级的单元测试技术,例如模拟 . FizzBu ...
- 使用FizzBuzz和Mockito进行单元测试
我有时使用FizzBuzz向新手演示单元测试的基础. 尽管FizzBuzz确实是一个简单的问题,但是它也可以用于演示更高级的单元测试技术,例如模拟 . FizzBuzz Kata: &qu ...
- zz测试接口_使用FizzBuzz和JUnitParams进行单元测试
zz测试接口 我有时使用FizzBuzz向新手演示单元测试的基础. 尽管FizzBuzz确实是一个简单的问题,但它也可以用于演示更高级的单元测试技术,例如实现参数化测试. FizzBuzz ...
- 使用FizzBuzz和JUnitParams进行单元测试
我有时使用FizzBuzz向新手演示单元测试的基础. 尽管FizzBuzz确实是一个简单的问题,但它也可以用于演示更高级的单元测试技术,例如实现参数化测试. FizzBuzz的可能解决方案 ...
- FizzBuzz Kata与Java流
在柔道练习仅几周之后,我的儿子感到无聊. 他抱怨说自己没有学任何东西,因为他一遍又一遍地做着同样的事情. 混淆学习和做新事物的不仅仅是幼儿. 例如,有多少软件开发人员通过执行kata或参加dojos来 ...
- mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用
本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用.本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山.本文将使用mock ...
- deepin中zz_如何解决R中的FizzBuzz问题
deepin中zz The FizzBuzz problem is a classic test given in coding interviews. The task is simple: Fiz ...
- kata_Java中的功能性FizzBuzz Kata
kata 不久前,我使用Java 8流和lambda解决了FizzBuzz kata问题. 尽管最终结果是可行的,但中间步骤却没有. 我当然可以做得更好. 与往常一样,让我们从失败的测试开始: ...
- Java中的功能性FizzBuzz Kata
不久前,我使用Java 8流和lambda解决了FizzBuzz kata问题. 尽管最终结果是可行的,但中间步骤却没有. 我当然可以做得更好. 与往常一样,让我们从失败的测试开始: pack ...
最新文章
- java 模拟get登录_java 模拟get请求
- linux 非阻塞 socket,linux 非阻塞式socket编程求助。。
- java基础入门-预定义类与自定义类
- java 读取css文件_java文件读取的两种方式
- SQL Server 2014安装教程
- zookeeper 源码阅读(1)
- Postman status: 415_415亩!白云首宗农村土地规模化流转成功签约
- 一种全新的软件界面设计方法
- C++复习 auto
- winform listbox增加鼠标双击事件
- 关于ENSP1.2.00.510安装过程中的一点心得
- mysql blob 字段,mysql BLOB字段类型用法介绍
- 问脉首创旁路云原生安全检测框架!
- 2013 ACM-ICPC南京赛区全国邀请赛
- [Docker]进入容器命令
- 高仿网易评论列表效果之界面分析
- 【数据结构与算法】专栏系列文章目录
- ViewPager 系列之 打造一个通用的 ViewPager
- 【linux】一篇全面的linux软件包管理的总结
- 计算机一级考试模拟题2003word,2015计算机一级MsOffice练习:Word2003