在单元测试中访问私有字段
首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段。
但是,(“ 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中执行相同的操作,以通过反射来更改字段的可见性,但是我认为常规解决方案可以是一种更清洁,更轻松的方法。
现在,我将根据以下建议完成这篇文章:
除非确实确实需要修改私有变量以对类进行单元测试,否则请不要使用此解决方案!
翻译自: https://www.javacodegeeks.com/2014/02/access-private-fields-in-unit-tests.html
在单元测试中访问私有字段相关推荐
- 继承能够访问父类私有字段_在单元测试中访问私有字段
继承能够访问父类私有字段 首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段. 但是,(" buts"是人们仍在编程而不是计算机本身的原因,所以在这里很 ...
- C#中访问私有成员技巧
源代码是别人的,你就不能修改源代码,只提供给你dll.或者你去维护别人的代码,源代码却有丢失.这样的情况如果你想知道私有成员的值,甚至去想直接调用类里面的私有方法.那怎么办呢?其实在.net中访问私有 ...
- java aspectj_java-如何使用AspectJ访问私有字段?
我正在研究AspectJ及其许多用途,并发现了mixin. 我可以找到许多使用纯AspectJ .aj方面的示例,但是我只需要使用@AspectJ批注. 我要实现的目标如下: 我有一个无法修改的类,它 ...
- php 数组作用域,如何在php中访问私有作用域命名空间数组数据?
这是数组数据: Coinbase\Wallet\Resource\ResourceCollection Object ( [previousUri:Coinbase\Wallet\Resource\R ...
- java 访问私有成员,在Java中访问私有方法?
how to implement such a functionality to access private members ? Java checks access permissions dur ...
- Java反射 - 私有字段和方法
尽管普遍认为通过Java Reflection可以访问其他类的私有字段和方法. 这并不困难. 这在单元测试中可以非常方便. 本文将告诉你如何. 访问私有字段 要访问私有字段,您需要调用Class.ge ...
- javascript终于支持本机私有字段和方法
JavaScript is known to be quite confusing for beginners as it contains some tricky concepts which re ...
- 编译器对私有字段初始化的优化
今天Review时看到自己写的这样一段类似的代码: internal class TestClass {private bool _inited = false;private int _count ...
- java静态成员方法_关于java:在静态方法中访问类的静态成员
我在java中有这个代码我用netbeans写它 class sample { public static int x; public int y; sample() { x=0; } } publi ...
最新文章
- 防止模型过拟合的必备方法!
- 计算机视觉模型效果不佳,你可能是被相机的Exif信息坑了
- Python之glob模块进行文件匹配及遍历
- mq 自动消费 php,php – 从RabbitMq消费不确认消息
- 硅片行业:过剩背景下的寡头市场
- php 循环链表,PHP实现循环链表功能
- spring mvc学习(8):springmvc常用注解代码
- innodb 共享表空间 转 独立表空间 详细说明
- mysql的分区技术
- vector用法 java_java.util.vector中的vector的详细用法
- CAS(Central Authentication Service)——windows上简单搭建及測试
- Jmeter(十一)测试监听
- Nicescroll滚动条插件的用法
- Java第二课. 数据类型与运算符
- Python学习 之 tenacity重试模块
- buuctf web1
- access查询两列信息合并输出_如何在Access中合并两个数据表中的数据
- 计算机科学与昆虫,基于视觉的昆虫物种识别算法研究
- 苹果分屏软件_苹果 | iOS13来了,老iPhone再战一年
- 修改chrome滚动条的样式
热门文章
- SQL注入问题及预防方法
- Mybatis框架的连接池配置
- php批量评价,彻底杜绝 WordPress 批量垃圾评论留言的三步曲
- 时间格式转换2020-04-09T23:00:00.000+08:00
- java socket实现简单即时通讯
- 基于centos8搭建zookeeper集群
- 转:集群和分布式的区别
- selenium自动化测试_维持Selenium测试自动化的完美方法
- java 8 stream_Java 8 Stream示例
- deprecated_使用Java的@Deprecated前瞻