继承能够访问父类私有字段_在单元测试中访问私有字段
繼承能夠訪問父類私有字段
首先,讓我大聲說一下,您需要將代碼設計為可測試的,以便通過公共方法測試私有字段。
但是,(“ 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
繼承能夠訪問父類私有字段
總結
以上是生活随笔為你收集整理的继承能够访问父类私有字段_在单元测试中访问私有字段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人人乐成立日期(人人乐备案号)
- 下一篇: 甲骨文函数初探