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

但是,(“ 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

在单元测试中访问私有字段相关推荐

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

    继承能够访问父类私有字段 首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段. 但是,(" buts"是人们仍在编程而不是计算机本身的原因,所以在这里很 ...

  2. C#中访问私有成员技巧

    源代码是别人的,你就不能修改源代码,只提供给你dll.或者你去维护别人的代码,源代码却有丢失.这样的情况如果你想知道私有成员的值,甚至去想直接调用类里面的私有方法.那怎么办呢?其实在.net中访问私有 ...

  3. java aspectj_java-如何使用AspectJ访问私有字段?

    我正在研究AspectJ及其许多用途,并发现了mixin. 我可以找到许多使用纯AspectJ .aj方面的示例,但是我只需要使用@AspectJ批注. 我要实现的目标如下: 我有一个无法修改的类,它 ...

  4. php 数组作用域,如何在php中访问私有作用域命名空间数组数据?

    这是数组数据: Coinbase\Wallet\Resource\ResourceCollection Object ( [previousUri:Coinbase\Wallet\Resource\R ...

  5. java 访问私有成员,在Java中访问私有方法?

    how to implement such a functionality to access private members ? Java checks access permissions dur ...

  6. Java反射 - 私有字段和方法

    尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法. 这并不困难. 这在单元测试中可以非常方便. 本文将告诉你如何. 访问私有字段 要访问私有字段,您需要调用Class.ge ...

  7. javascript终于支持本机私有字段和方法

    JavaScript is known to be quite confusing for beginners as it contains some tricky concepts which re ...

  8. 编译器对私有字段初始化的优化

    今天Review时看到自己写的这样一段类似的代码: internal class TestClass {private bool _inited = false;private int _count ...

  9. java静态成员方法_关于java:在静态方法中访问类的静态成员

    我在java中有这个代码我用netbeans写它 class sample { public static int x; public int y; sample() { x=0; } } publi ...

最新文章

  1. rabbitmq Centos6.8安装及基础命令
  2. 目的地返回POJ 2336 动态规划(DP) Ferry Loading II
  3. (转载)VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)
  4. centos7 dns配置_Centos7.7 安装FreeIPA (三)
  5. linux下c 编译脚本,Linux下编译C语言与makefile脚本语言
  6. linux mysql 安装innodb_在ubuntu Mysql 5.7 安装InnoDB Memcached 插件
  7. python通过ssh配置交换机_配置(通过SSH)Cisco交换机的Python脚本
  8. 一步一步学Linq to sql(八):继承与关系
  9. CUDNN v3特性
  10. 在Linux平台使用Firefox 登陆EBS r12环境
  11. 设置货币值中使用的小数位数
  12. 二叉排序树,二叉平衡树,红黑树,B树,B+树的区别,作用,特性
  13. 我的个人网站,终于上线了!
  14. 树莓派CM4_Tiny(双HDMI)扩展板基于Retropie的游戏配置操作演示
  15. fckeditor文档库
  16. 【添坑】高博ORB_SLAM
  17. Bonobo Git Server搭建本地(Windows)私有的Git服务器
  18. 华为接入交换机基于MAC地址做端口绑定
  19. 不懂的代码要先背下来吗?
  20. Win10系统联想笔记本wifi和蓝牙无法打开的解决方法

热门文章

  1. Flume整合SparkStreaming出现UnsupportedClassVersionError: org/apache/spark/streaming/flume/sink/SparkFlum
  2. 第7步 mybatis-generator dao层生成器
  3. html表格转换为csv,python实现将html表格转换成CSV文件的方法
  4. 中海达手部链接电脑安装软件_山东水文局:较大含沙量条件下中海达ADCP外接测深仪测流系统试验成功...
  5. java 十六进制浮点_Java十六进制浮点文字
  6. packt_Packt发行的$ 5 Java编程书籍:精通Java 9,Java 9高性能
  7. lua加密教程_我们相信加密! 教程
  8. sidecar_Spring Cloud Sidecar –节点初始化
  9. jooq 配置oracle_jOOQ配置
  10. Java 14的新功能