java抽象类和模板模式_测试抽象类和模板方法模式

java抽象类和模板模式

摘自Wikipedia,“模板方法定义了算法的程序框架。 子类可以覆盖一个或多个算法步骤,以允许不同的行为,同时确保仍然遵循总体算法。”

通常,此模式由两个或多个类组成,一个是提供模板方法(非抽象)的抽象类,该模板方法具有对由一个或多个具体子类实现的抽象方法的调用。

模板抽象类和具体实现通常位于同一项目中,但是根据项目范围,这些具体对象将被实现到另一个项目中。

在这篇文章中,我们将看到在外部项目上实现具体类时如何测试模板方法模式,或更一般的如何测试抽象类。

让我们看一个简单的模板方法模式示例。 考虑一个负责接收整数向量并计算欧几里得范数的类。 这些整数可以从多个来源接收,并留给每个项目以提供一种获取它们的方法。

模板类如下所示:

public abstract class AbstractCalculator {public double euclideanNorm() {int[] vector = this.read();int total = 0;for(int element:vector) {total+= (element*element);  }return Math.sqrt(total);}public abstract int[] read();
}

现在,另一个项目可以扩展上一类,并通过提供read()方法的实现来实现抽象计算器。

public class ConsoleCalculator extends AbstractCalculator {public int[] read() {int [] data = new int[0];Scanner scanner = new Scanner(System.in);//data = read requried data from consolereturn data; }}

编写了具体实现的开发人员将只测试read()方法,他可以“相信”抽象类的开发人员已经测试了非抽象方法。

但是,如果类是抽象的并且需要read()方法的实现,我们将如何在计算方法上编写单元测试?

第一种方法可能是创建伪造的实现:

public class FakeCalculator extends AbstractCalculator {private int[] data;public FakeCalculator(int[] data) {this.data = data;}public int[] read() {return this.data;}}

这不是一个坏方法,但是有一些缺点:

  • 测试的可读性较差,读者应该知道这些假类的存在,并且必须确切地知道他们在做什么。
  • 作为测试作者,您将花费时间来实现伪类,在这种情况下,这很简单,但是您的项目可能有多个不执行任何抽象类,甚至没有多个抽象方法。
  • 假类的行为是“硬编码的”。

更好的方法是使用Mockito仅模拟抽象方法,同时调用非抽象方法的实现。

public class WhenCalculatingEuclideanNorm {@Testpublic void should_calculate_correctly() {AbstractCalculator abstractCalculator = mock(AbstractCalculator.class, Mockito.CALLS_REAL_METHODS);doReturn(new int[]{2,2}).when(abstractCalculator).read();assertThat(abstractCalculator.euclideanNorm(), is(2.8284271247461903));}@Testpublic void should_calculate_correctly_with_negative_values() {AbstractCalculator abstractCalculator = mock(AbstractCalculator.class, Mockito.CALLS_REAL_METHODS);doReturn(new int[]{-2,-2}).when(abstractCalculator).read();assertThat(abstractCalculator.euclideanNorm(), is(2.8284271247461903));}}

Mockito通过调用真实方法简化了抽象类的测试,并且仅对抽象方法进行了存根处理。 看到这种情况是因为默认情况下我们正在调用真实方法,而不是使用典型的when()then()结构,而是必须使用doReturn模式。

当然,仅当您的项目不包含算法的具体实现,或者您的项目将成为另一个项目的第3方库的一部分时,才可以使用此方法。 在其他情况下,解决问题的最佳方法是测试实现的类。

下载源代码

参考:在One Jar to Rulem All博客上测试了我们的JCG合作伙伴 Alex Soto的抽象类(尤其是模板方法模式) 。


翻译自: https://www.javacodegeeks.com/2012/06/testing-abstract-classes-and-template.html

java抽象类和模板模式

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

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

相关文章

第三章 使用单元测试测试简单的首页

3.1第一个Django应用,第一个单元测试 python3 manage.py startapp lists 创建一个应用 功能测试站在用户的角度从外部测试应用,而单元测试从程序员的角度从内部测试应用 3.2Django中的单元测试 打开新生成的的文件lists/tests.py 注:单元测试…

微型计算机应用领域及应用,自考“微型计算机应用基础”自考大纲(1)

I. 课程性质微型计算机应用基础是高等教育自学考试经济管理类各专业的一门必修的应用基础课程,同时它也适用于文、法、医、农各专业选修。了解计算机这一现代化工具的性能、特点和一般工作原理,掌握计算机基础知识,学会计算机的基本操作&…

Lambda的Lambda(如果可选)

因此,我对JDK 8中Optional接口的两个限制感到沮丧。第一个问题是,没有明显的方法可以在块中执行else操作,因为只有isPresent方法,除非您使用的是老式的if语句。 第二个问题当然是古老的板栗,即使您能够做到&#xff0c…

win7链接html线到屏幕上,为你解决win7系统html文件图标变成空白的具体技巧 - win7吧...

我们经常在电脑上安装应用软件,难免会遇到诸如win7系统html文件图标变成空白的状况,对于大多电脑用户而言,大家几乎都是首次看到win7系统html文件图标变成空白这种状况,其实小编的经验是碰到win7系统html文件图标变成空白的问题别…

周赛。。。。

分糖果 分糖果 题意 要篮子里有不少于 n 块糖果,幼儿园的所有 n 个小朋友(包括你自己)都从篮子中拿走恰好一块糖,直到篮子里的糖数量少于 n 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励。 思路 这个程…

计算机科学之前说,国内计算机科学十强大学是哪些?前2名没悬念,后面几所都不好说...

随着科技的发展、产业结构的不断优化,许多单位对计算机相关专业人才需求量越来越大,计算机专业毕业生就业情况普遍不差。加上计算机学科本身就给人一种“格局很高”的感觉,所以该专业成为了当下最热门的专业之一,每年高考都会有一…

服务引用代理类_在代理类中引用动态代理

服务引用代理类在Stackoverflow中有一个有趣的问题 ,关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务,Spring AOP,缓存,异步流等。需要对代理的引用,因为如果存在对自身的调用通过代理bean&#xff…

HTML中confirm替换,Javascript直接Confirm()函数替换

我想替换Javascript Confirm()函数以允许自定义按钮,而不是Yes / Cancel.我尝试搜索,但是所有解决方案都是事件驱动的,例如jquery对话框(其中代码不等待响应,而是事件驱动的).有谁知道非事件驱动的解决方案.它必须在Safari和IE中都可以使用(因此没有vbscript).这是系统许多部分…

关于windows防火墙关不掉解决办法

建立一个.bat文件,写以下内容: echo off title 正在启动防火墙服务 sc config MpsSvc startauto net start MpsSvc pause 至此完毕,重启试试就知道了 转载于:https://www.cnblogs.com/ciscolee/p/7616588.html

Java中特质模式的定义

在本文中,我将介绍特征的概念,并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例。 我将首先提出一个虚构的案例,其中可以使用特征来减少重复,然后以使用Java 8的特征模式示例实现为结尾。 假设您正在开发留言…

计算机 注册表 远程桌面,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...

计算机在开启远程桌面的时候选中了“仅允许运行使用网络级别身份验证的远程桌面计算机连接”,于是连接时提示错误如下:远程计算机需要网络级别身份验证,而您的计算机不支持该验证,请联系您的系统管理员或者技术人员来获得帮助解决…

前端笔记----定位

一.定位分三种&#xff1a;相对定位&#xff0c;绝对定位和固定定位。 1.相对定位&#xff1a;元素所占据的文档流的位置保留&#xff0c;元素本身相对自身原位置进行偏移&#xff1b; 如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

html往下滑变成水平,HTML - 水平滑块CSS最佳方法_html_开发99编程知识库

由於每個部分的位置已經設置為relative&#xff0c;意味著將relative定位到上一節&#xff0c;因此可以將其他部分設置為left: 0 。* {margin: 0;}#all-sections{display:inline-flex;}.main, .about, .professional, .fun-stuff, .blog, .contact{height:100vh;position: rela…

JS高级 - 面向对象3(面向过程改写面向对象)

改写&#xff1a; 1.前提&#xff1a;所有东西都在 onload 里 2.改写&#xff1a;不能有函数嵌套&#xff0c;可以有全局变量 onload --> 构造函数 全局变量 --> 属性 函数 --> 方法 4.改错&#xff1a; thisthis啥时候会出问题&#xff1f; 1.定时器 <script>f…

mockito环境配置_Mockito –使用全局配置的SmartNull在NPE上提供更好的错误消息

mockito环境配置编写Mockito参考卡后&#xff0c;我有机会仔细研究了Mockito不太流行但非常有用的功能。 其中一些过于先进或太稀少&#xff0c;无法在refcard中进行描述&#xff0c;因此应简短说明。 其中之一就是SmartNull。 当前&#xff0c;非空方法返回适用于已知类型&…

html js清除缓存,js清除浏览器缓存的几种方法

JS 缓存的问题一直都是我们又爱又恨的东西。也是我们比较头痛的问题&#xff0c; 一方面为了提高网站响应速度,减少服务器的负担,和节省带宽&#xff0c;将需要将静态资源缓存在客户端&#xff0c; 但是另一方面&#xff0c;当js 文件有改动的时候&#xff0c;如何快速的将客户…

spring MVC 的MultipartFile转File读取

第一种方法&#xff1a; MultipartFile file xxx; CommonsMultipartFile cf (CommonsMultipartFile)file; DiskFileItem fi (DiskFileItem)cf.getFileItem(); File f fi.getStoreLocation(); 会在项目的根目录的临时文件夹下生成一个文件&#xff1b; 第二…

代理模式介绍

代表&#xff1a;被选中或当选为他人投票或代表他人的人– Merriam-Webster 。 委托模式&#xff1a;在软件工程中&#xff0c;委托模式是面向对象编程中的一种设计模式&#xff0c;其中&#xff0c;一个对象而不是执行其声明的任务之一&#xff0c;而是将该任务委托给一个关联…

江西理工大学 微型计算机原理,江西理工大学-微机原理考试(wenwei)作业.docx

江西理工大学-微机原理考试(wenwei)作业第一章1. 在计算机内部为什么要采用二进制数而不采用十进制数&#xff1f;  2. 设机器字长为6位&#xff0c;写出下列各数原码、补码和移码&#xff1a;  10101 11111 10000 ?-10101 -11111 -10000  3. 利用补码进行加/减法运算比…

C语言中数组做函数参数的问题

数组做函数参数&#xff0c;会退化成为一个指针变量。因此在进行数组参数传递的同时&#xff0c;需要传递一个数组长度的参数变量。 数组长度可以通过sizeof(arr)/siezof(arr[0])来得到。关于这个sizeof操作符&#xff0c;简单的理解就是求得指针指向的内存块的大小。 当数组作…