继承能够访问父类私有字段_在单元测试中访问私有字段

继承能够访问父类私有字段

首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段。

但是,(“ buts”是人们仍在编程而不是计算机本身的原因,所以在这里很高兴)有时您想要并且应该更改一些私有字段以测试所有可能的边界。

通常,可以通过公共获取器和设置器或使用类构造函数来修改私有字段,在这种情况下,测试很容易创建并且每个人都很高兴。

但是,当您使用诸如Spring之类的外部框架时,可能无法控制注入的私有字段。

我已经在上一篇文章中解释了如何在测试中模拟spring组件,而无需维护和创建即席测试spring configuraitons ,这里我将向您展示如何为测试修改私有变量。

让我们说一下代码:

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.google.common.collect.ImmutableSet;
@Service
public class SomeService {@Value("${whitelist.api.users:A,B,C}")private String apiUsers;private ImmutableSet<String> acceptableAPIBUsers;@PostConstructpublic void init() {acceptableAPIBUsers = ImmutableSet.copyOf(apiUsers.replaceAll(" ", "").split(","));}public boolean isAnAcceptableUser(String user) {return user == null ? false : acceptableAPIBUsers.contains(user.toUpperCase());}
}

我们无法控制apiUsers字符串,因此我们有几个简单的选项,一个是为测试创建一个Spring配置,修改Spring上下文并模拟该属性,两个是创建一个setter来更改测试中的属性。

我不鼓励只为您的测试创建公共评估者,这会使其他人在查看您的代码以及为测试创建和维护Spring配置时感到困惑。

我知道您在想什么:“如果以上任何一项我都做不到,我将被解雇,我的女朋友会离开我,我的生活已经结束”,但您不用担心,我在这里向您展示另外的选择!

继续

您可以使用静态方法创建groovy类,以评估测试中的私有字段:

import groovy.transform.CompileStatic
@CompileStatic
class SomeServiceAccessor {public static void setApiUsers(SomeService someService,String apiUsers){someService.@apiUsers = apiUsers}
}

并在单元测试中使用它:

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
public class SomeServiceTest {private SomeService service;@Beforepublic void setUp() {service = new SomeSercvice();SomeSercviceAccessor.setApiUsers(service, "pippo,pluto,bungabunga");service.init();}@Testpublic void testIsNotApiUser() {assertThat(service.isAnRTBUser(""), is(false));assertThat(service.isAnRTBUser(null), is(false));assertThat(service.isAnRTBUser("random"), is(false));}@Testpublic void testIsRTBUser() {assertThat(service.isAnRTBUser("pippo"), is(true));assertThat(service.isAnRTBUser("PIPPO"), is(true));assertThat(service.isAnRTBUser("pluto"), is(true));assertThat(service.isAnRTBUser("bungabunga"), is(true));}
}

当然,您可以在Java中执行相同的操作,以通过反射来更改字段的可见性,但我认为常规解决方案可以是一种更干净,更轻松的方法。

现在,我将根据以下建议完成这篇文章:

除非您确实真的需要修改私有变量以对类进行单元测试,否则请不要使用此解决方案!

参考:从我们的JCG合作伙伴 Marco Castigliego的“ 删除重复项和修复不良名称”博客中访问单元测试中的私有字段 。

翻译自: https://www.javacodegeeks.com/2014/02/access-private-fields-in-unit-tests.html

继承能够访问父类私有字段

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

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

相关文章

php模拟论坛,模仿OSO的论坛(二)

模仿OSO的论坛(二)2006-10-09 00:00:00 作者&#xff1a;模仿OSO的论坛(二)read.php(用来显示相关主题内容)疑难问题主 题&#xff1a;color#993333>include "connect.inc.php";$query "select * from guestbook where id".$theme_id;$res mysql_quer…

甲骨文函数初探

我非常高兴有机会通过Cloud Native Limited Availability Program来测试Oracle功能。 去年&#xff0c;当我上次尝试在Oracle Groundbreaker APAC巡回赛中在Oracle Cloud中运行无服务器功能时&#xff0c;有两种选择。 您可以在虚拟机中运行我自己的Fn服务器&#xff0c;也可以…

oracle 邻接模型,【原创】MySQL 模拟Oracle邻接模型树形处理

数据库对层次结构的处理模型有好多种&#xff0c;可以根据自己的需求来设计模型&#xff0c;当然最简单的也是最容易设计的模型就是所谓的邻接模型。在这方面&#xff0c;其他数据库比如Oracle提数据库对层次结构的处理模型有好多种&#xff0c;可以根据自己的需求来设计模型&a…

json字符串导入oracle,如何在Oracle中将JSON字符串转换为JSON

我需要在Oracle查询中将JSON字符串转换为JSON。示例字符串&#xff1a;{"1":{"qid":1,"aid":1,"a":"Yes","isdyn":0},"2":{"qid":2,"aid":7,"a":"sdfbsjkb",&…

spring roo_使用Spring Roo进行概念验证

spring roo在Keyhole工作期间&#xff0c;我参与了许多项目&#xff0c;其中客户要求我们重写旧系统&#xff0c;同时保留其现有数据库。 有时&#xff0c;它有助于快速演示如何使用当前技术来简化开发&#xff0c;测试和维护其代码。 我发现可以创建一个快速示例&#xff08;…

【渝粤教育】电大中专药物分析技术基础作业 题库

1.《中国药典》规定“称定”时&#xff0c;指称取重量应准确至所取重量的 A.10% B.1.95&#xff5e;2.05g C.百分之一 D.1.5&#xff5e;2.5g E.千分之一 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.2℃&#xff5e;10℃指 A.密闭 B.密封 C.阴凉处 D.冷处…

oracle虚拟机怎么装系统,Virtualbox怎么安装系统 VirtualBox虚拟机安装Win8系统教程 (3)...

三、对新建的虚拟机做重要的设定&#xff1a;1、在Oracle VM VirtualBox里面点击下刚才建好的虚拟机&#xff0c;然后点下上面的黄色图标“设置”&#xff0c;或者右键菜单里面点击设置也可以(快捷键是CtrlS)Oracle VM VirtualBox虚拟机设置2、在出来的设置页面里面&#xff0c…

JDK 12的Files.mismatch方法

JDK 12向Files类引入了一种新方法。 方法Files.mismatch(Path,Path)已通过JDK-8202302引入JDK 12&#xff0c;并在JDK 12 Early Access Build 20 &#xff08;支持新{systemProperty} Javadoc标记的相同早期访问版本&#xff09;中可用 。 JDK-8202302 [“用于比较文件的&…

【渝粤教育】电大中专计算机网络基础 (2)作业 题库

1通信中产生和发送信息的一端叫做&#xff08;&#xff09;。 A信源 B信宿 C信道 D噪声 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2通信中接收信息的一端叫做&#xff08;&#xff09;。 A信源 B信宿 C信道 D噪声 正确 正确答案&#xff1a;左边查询 学生答案…

oracle xe gentoo,Oracle在gentoo下安装

补充:解决ORACLE10G安装界面中文乱码问题&#xff0c;修改以下变量使安装界面为英文。export LC_CTYPEen_US.UTF-8以下为原文1.OS:Gentoo-linux-2.6.23-rc5Oracle:Oracle Database 10g Release 2 (10.2.0.1.0) for Linux x86下载地址&#xff1a;2.使用管理员账户建立Oracle用户…

【渝粤教育】电大中专跨境电子商务理论与实务 (11)作业 题库

1.在按照交易主体类型中&#xff0c;&#xff08; &#xff09;面对的最终客户为企业或集团客户&#xff0c;提供企业、产品、服务等相关信息。 A.O2O跨境电商或平台 B.B2B跨境电商或平台 C.B2C跨境电商或平台 D.C2C跨境电商或平台 错误 正确答案&#xff1a;左边查询 学生答案…

【渝粤题库】陕西师范大学209041 金融工程学 作业(专升本)

《金融工程学》作业 一、选择题 1.证券投资收益最大化和风险最小化这两个目标&#xff08; &#xff09;. A.可以同时实现&#xff1b; B.是一致的&#xff1b; C.是相互冲突的&#xff1b; D.大多数情况下可以同时实现. 2.金融工程中&#xff0c;通常用&#xff08; &#xff…

php 排序不影响索引,为什么不能通过索引避免排序操作呢??

谢谢各位的回复,尤其是棉花糖ONE!忘了说了,我的数据库版本是:10.2.0.4 的刚才做了一个10053事件.CASE WHEN STOCK_NUM>0 THEN 1 ELSE 0 END1 确实被重写成了STOCK_NUM>0.在这种情况下:SELECT * FROM(select /* INDEX(zsj_test) */pricefrom zsj_testwhere productnamerpa…

redis简单队列java_使用Redis的简单消息队列

redis简单队列java在本文中&#xff0c;我们将使用列表命令将Redis用作简单的消息队列。 假设我们有一个允许用户上传照片的应用程序。 然后在应用程序中&#xff0c;我们以不同大小显示照片&#xff0c;例如Thumb&#xff0c;Medium和Large。 在第一个实现中&#xff0c;我们…

【渝粤题库】陕西师范大学700002 细胞生物学

《细胞生物学》作业 一、名词解释 &#xff11;&#xff0e;细胞学说   &#xff12;&#xff0e;原位杂交    &#xff13;&#xff0e;细胞通讯   4&#xff0e;核纤层 5&#xff0e;早熟染色体凝集 6&#xff0e;细胞识别    7&#xff0e;细胞分化    &#xff18;…

【渝粤教育】电大中专Office办公软件 (2)_1作业 题库

1学习好Office办公软件这门课程&#xff0c;应该&#xff08;&#xff09;。 A重视理论学习 B重视上机操作&#xff0c;多练多试&#xff0c;还要学习好基础的知识 C只看不练 D可以随便学习一下 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2在使用Office2016时遇…

oracle 群集 无存储,存储的群集注意事项 - Oracle® ZFS Storage Appliance 管理指南

存储的群集注意事项为了在群集中使用而对 Oracle ZFS Storage Appliance 进行大小调整时&#xff0c;另有两个非常重要的注意事项。或许最重要的决定是将所有存储池的所有权分配给同一机头还是在两个机头之间分割。此处有几点要加以权衡&#xff0c;如下表中所示。一般来说&…

JMetro 5.2版发布

再一次问好 JMetro的新更新刚刚发布。 添加了两种新的控件样式&#xff1a;“标题窗格”和“手风琴”。 此外&#xff0c;还对现有样式和错误修复进行了调整。 最终&#xff0c;JMetro现在也可以通过Maven Central获得。 在本文中&#xff0c;我将详细介绍刚刚发布的JMetro 5…

【渝粤教育】电大中专Office办公软件 (2)作业 题库

1.一个汉字在存储时&#xff0c;占据&#xff08; &#xff09;个字节的存储空间。 A.1 B.2 C.4 D.3 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.学习好Office办公软件这门课程&#xff0c;应该&#xff08; &#xff09;。 A.可以随便学习一下 B.只看不练 C.…

【渝粤教育】电大中专Windows操作系统_1作业 题库

学习好Windows10应用这门课程&#xff0c;应该&#xff08;&#xff09;。 A重视理论学习 B重视上机操作&#xff0c;多练多试 C只看不练 D可以随便学习一下 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2在使用Windows时遇到困难&#xff0c;&#xff08;&#…