日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 继承能够访问父类私有字段_在单元测试中访问私有字段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

繼承能夠訪問父類私有字段

首先,讓我大聲說一下,您需要將代碼設計為可測試的,以便通過公共方法測試私有字段。

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

繼承能夠訪問父類私有字段

總結

以上是生活随笔為你收集整理的继承能够访问父类私有字段_在单元测试中访问私有字段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。