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

但是,(“ 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. 防止模型过拟合的必备方法!
  2. 计算机视觉模型效果不佳,你可能是被相机的Exif信息坑了
  3. Python之glob模块进行文件匹配及遍历
  4. mq 自动消费 php,php – 从RabbitMq消费不确认消息
  5. 硅片行业:过剩背景下的寡头市场
  6. php 循环链表,PHP实现循环链表功能
  7. spring mvc学习(8):springmvc常用注解代码
  8. innodb 共享表空间 转 独立表空间 详细说明
  9. mysql的分区技术
  10. vector用法 java_java.util.vector中的vector的详细用法
  11. CAS(Central Authentication Service)——windows上简单搭建及測试
  12. Jmeter(十一)测试监听
  13. Nicescroll滚动条插件的用法
  14. Java第二课. 数据类型与运算符
  15. Python学习 之 tenacity重试模块
  16. buuctf web1
  17. access查询两列信息合并输出_如何在Access中合并两个数据表中的数据
  18. 计算机科学与昆虫,基于视觉的昆虫物种识别算法研究
  19. 苹果分屏软件_苹果 | iOS13来了,老iPhone再战一年
  20. 修改chrome滚动条的样式

热门文章

  1. SQL注入问题及预防方法
  2. Mybatis框架的连接池配置
  3. php批量评价,彻底杜绝 WordPress 批量垃圾评论留言的三步曲
  4. 时间格式转换2020-04-09T23:00:00.000+08:00
  5. java socket实现简单即时通讯
  6. 基于centos8搭建zookeeper集群
  7. 转:集群和分布式的区别
  8. selenium自动化测试_维持Selenium测试自动化的完美方法
  9. java 8 stream_Java 8 Stream示例
  10. deprecated_使用Java的@Deprecated前瞻