亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

如何使用Mock修改Android設(shè)備上的features

瀏覽:4日期:2022-09-19 16:30:36
背景

手工測(cè)試過程中有個(gè)測(cè)試場(chǎng)景需要?jiǎng)h除測(cè)試設(shè)備上某個(gè)Android feature,往上搜索了一圈沒找到有效的操作方法。獲取Android設(shè)備所有的feature可以通過adb命令pm list features或者Android代碼Context.getPackageManager().getSystemAvailableFeatures(),但都沒有對(duì)應(yīng)的修改方法。

既然feature是從Context獲取的,那能不能構(gòu)造一個(gè)只包含我想要的feature的Context呢。順著這個(gè)思路,有了下面的方案。

方案設(shè)計(jì)

單元測(cè)試常用的Mock技術(shù),就是來構(gòu)造假/模擬對(duì)象的。但如果完全構(gòu)造,又擔(dān)心和真實(shí)環(huán)境差別較大,測(cè)試結(jié)果不可靠。能不能從真實(shí)Android設(shè)備中獲取真實(shí)的Context,把不想要的feature去除,再給到被測(cè)試方法中呢?

答案是肯定的,通過選用流行的Mock組件Mockito ,官網(wǎng)上給出了下面2種Mock Java對(duì)象的方式:

mock()/@Mock: create mock spy()/@Spy: partial mocking, real methods are invoked but still can be verified and stubbed

可以看到Spy這種Mock方式可完美地解決我的需求。

實(shí)現(xiàn)(簡(jiǎn)化版需求)業(yè)務(wù)需求說明

獲取所有Android Features并把feature name打印在日志中,使用adb命令的效果如下:

➜ study git:(master) ✗ adb shell pm list features feature:reqGlEsVersion=0x30002feature:android.hardware.audio.outputfeature:android.hardware.bluetoothfeature:android.hardware.bluetooth_lefeature:android.hardware.camerafeature:android.hardware.camera.anyfeature:android.hardware.camera.autofocusfeature:android.hardware.camera.capability.manual_post_processingfeature:android.hardware.camera.capability.manual_sensorfeature:android.hardware.camera.capability.rawfeature:android.hardware.camera.flashfeature:android.hardware.camera.frontfeature:android.hardware.camera.level.fullfeature:android.hardware.faketouchfeature:android.hardware.locationfeature:android.hardware.location.gpsfeature:android.hardware.location.networkfeature:android.hardware.microphonefeature:android.hardware.nfc.anyfeature:android.hardware.opengles.aepfeature:android.hardware.ram.normalfeature:android.hardware.screen.landscapefeature:android.hardware.screen.portraitfeature:android.hardware.sensor.accelerometerfeature:android.hardware.sensor.compassfeature:android.hardware.sensor.lightfeature:android.hardware.sensor.proximityfeature:android.hardware.sensor.stepcounterfeature:android.hardware.telephonyfeature:android.hardware.telephony.cdmafeature:android.hardware.telephony.gsmfeature:android.hardware.touchscreenfeature:android.hardware.touchscreen.multitouchfeature:android.hardware.touchscreen.multitouch.distinctfeature:android.hardware.touchscreen.multitouch.jazzhandfeature:android.hardware.usb.accessoryfeature:android.hardware.usb.hostfeature:android.hardware.vulkan.computefeature:android.hardware.vulkan.levelfeature:android.hardware.vulkan.version=4194307feature:android.hardware.wififeature:android.hardware.wifi.directfeature:android.software.activities_on_secondary_displaysfeature:android.software.app_widgetsfeature:android.software.autofillfeature:android.software.backupfeature:android.software.companion_device_setupfeature:android.software.connectionservicefeature:android.software.ctsfeature:android.software.device_adminfeature:android.software.file_based_encryptionfeature:android.software.input_methodsfeature:android.software.live_wallpaperfeature:android.software.managed_usersfeature:android.software.midifeature:android.software.picture_in_picturefeature:android.software.printfeature:android.software.securely_removes_usersfeature:android.software.sipfeature:android.software.sip.voipfeature:android.software.verified_bootfeature:android.software.voice_recognizersfeature:android.software.webview業(yè)務(wù)需求代碼實(shí)現(xiàn)

public class FeaturesUtil { private static final String TAG = 'FeaturesUtil'; public static void getFeatures(Context context) {PackageManager packageManager = context.getPackageManager();FeatureInfo[] featureInfos = packageManager.getSystemAvailableFeatures();for (FeatureInfo featureInfo : featureInfos) { Log.i(TAG, 'feature: ' + featureInfo.name);} }}測(cè)試代碼實(shí)現(xiàn)(去除bluetooth feature)

@Spy Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();; @Spy PackageManager packageManager = context.getPackageManager();@Test public void getFeatures() {// 去除bluetooth featureFeatureInfo[] mockedFeatureInfos = removeFeature(packageManager.getSystemAvailableFeatures(),Arrays.asList('android.hardware.bluetooth', 'android.hardware.bluetooth_le'));when(packageManager.getSystemAvailableFeatures()).thenReturn(mockedFeatureInfos);when(context.getPackageManager()).thenReturn(packageManager);FeaturesUtil.getFeatures(context); } /** * 根據(jù)feature name刪除一個(gè)或多個(gè)feature * * @param featureInfos FeatureInfo數(shù)組 * @param featureNames 字符串列表,每個(gè)元素是要?jiǎng)h除的FeatureInfo的name * @return 刪除之后的FeatureInfo數(shù)組 */ private FeatureInfo[] removeFeature(FeatureInfo[] featureInfos, List<String> featureNames) {List<FeatureInfo> featureInfoList = new ArrayList();for (FeatureInfo featureInfo : featureInfos) { if (featureInfo.name != null && !(featureNames.contains(featureInfo.name))) {featureInfoList.add(featureInfo); }}return featureInfoList.toArray(new FeatureInfo[featureInfoList.size()]); }運(yùn)行測(cè)試代碼后Logcat輸出

可以看到bluetooth相關(guān)的feature已經(jīng)沒有了

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.sensor.proximity

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.sensor.accelerometer

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.faketouch

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.usb.accessory

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.telephony.cdma

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.backup

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.touchscreen

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.touchscreen.multitouch

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.print

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.activities_on_secondary_displays

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.voice_recognizers

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.picture_in_picture

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.opengles.aep

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.autofocus

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.telephony.gsm

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.sip.voip

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.usb.host

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.audio.output

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.verified_boot

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.flash

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.front

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.screen.portrait

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.microphone

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.autofill

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.securely_removes_users

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.sensor.compass

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.hardware.touchscreen.multitouch.jazzhand

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.app_widgets

2021-04-07 13:23:39.266 16238-16268/? I/FeaturesUtil: feature: android.software.input_methods

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.sensor.light

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.vulkan.version

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.companion_device_setup

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.device_admin

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.screen.landscape

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.ram.normal

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.managed_users

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.webview

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.sensor.stepcounter

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.capability.manual_post_processing

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.any

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.capability.raw

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.vulkan.compute

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.connectionservice

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.touchscreen.multitouch.distinct

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.location.network

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.cts

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.sip

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.capability.manual_sensor

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.camera.level.full

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.wifi.direct

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.live_wallpaper

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.location.gps

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.software.midi

2021-04-07 13:23:39.267 16238-16268/? I/FeaturesUtil: feature: android.hardware.nfc.any

2021-04-07 13:23:39.268 16238-16268/? I/FeaturesUtil: feature: android.hardware.wifi

2021-04-07 13:23:39.268 16238-16268/? I/FeaturesUtil: feature: android.hardware.location

2021-04-07 13:23:39.268 16238-16268/? I/FeaturesUtil: feature: android.hardware.vulkan.level

2021-04-07 13:23:39.268 16238-16268/? I/FeaturesUtil: feature: android.hardware.telephony

2021-04-07 13:23:39.268 16238-16268/? I/FeaturesUtil: feature: android.software.file_based_encryption

2021-04-07 13:23:39.269 16238-16268/? I/TestRunner: finished: getFeatures(com.aniu.featuresmock.FeaturesUtilTest)

總結(jié) 不直接使用Mock,而是使用Spy,最大限度保持測(cè)試環(huán)境真實(shí)可靠,從而保證測(cè)試效果 測(cè)試代碼不要放在test目錄,要放在androidTest目錄,保證在真實(shí)設(shè)備上跑(不然代碼也會(huì)報(bào)錯(cuò))。目錄結(jié)構(gòu)如下:

如何使用Mock修改Android設(shè)備上的features

以上就是如何使用Mock修改Android設(shè)備上的features的詳細(xì)內(nèi)容,更多關(guān)于Mock修改Android features的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 日本伊人精品一区二区三区 | 国产精品大全 | 日本一卡2卡三卡4卡 免费网站仙踪 | 国产精品久久久久久久久久日本 | a级毛片在线视频免费观看 a级毛片在线播放 | 国产人成免费视频 | 亚洲美女视频一区 | 久久精品免费一区二区视 | 国产换爱交换乱理伦片 | 色天天天综合色天天碰 | 黄色一级在线观看 | 国产日韩欧美亚洲综合 | 国产区成人精品视频 | 特黄特色的大片观看免费视频 | 中国人xxxxxxx免费看 | 一级做α爱过程免费视频 | 亚洲精品久久精品h成人 | 久久一本久综合久久爱 | 91天堂亚洲精品一区 | 一本大道香蕉中文日本不卡高清二区 | 国产精品久久久久毛片 | 1024在线免费观看 | 日韩一级欧美一级毛片在线 | 国产成人午夜视频 | 久久在线免费视频 | 欧美一区二区三区在观看 | 日本人xxxxxxx中国 | 成人淫片免费视频95视频 | 国产a级三级三级三级 | 国产稀缺精品盗摄盗拍 | 香蕉免费一级视频在线观看 | 91外围| 拍拍拍精品视频在线观看 | 国产一级精品高清一级毛片 | 国产高清在线精品一区 | 久热香蕉在线爽青青 | 国产日韩欧美在线播放 | 国产精品久久一区一区 | 国产成人精品影视 | 婷婷色香五月激情综合2020 | 国产一区二区三区四区五区六区 |