西安市未央区建设局官方网站,呼市网站设计,wordpress官方安装主题,上海房价即将暴跌首先#xff0c;让我大声说一下#xff0c;您需要将代码设计为可测试的#xff0c;以便通过公共方法测试私有字段。 但是#xff0c;#xff08;“ buts”是人们仍在编程而不是计算机本身的原因#xff0c;所以在这里很高兴#xff09;有时您想要并且应该更改一些私有字… 首先让我大声说一下您需要将代码设计为可测试的以便通过公共方法测试私有字段。 但是“ 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 ImmutableSetString 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