成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

如何使用Mock修改Android設備上的features

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

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

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

方案設計

單元測試常用的Mock技術,就是來構造假/模擬對象的。但如果完全構造,又擔心和真實環境差別較大,測試結果不可靠。能不能從真實Android設備中獲取真實的Context,把不想要的feature去除,再給到被測試方法中呢?

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

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

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

實現(簡化版需求)業務需求說明

獲取所有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業務需求代碼實現

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);} }}測試代碼實現(去除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); } /** * 根據feature name刪除一個或多個feature * * @param featureInfos FeatureInfo數組 * @param featureNames 字符串列表,每個元素是要刪除的FeatureInfo的name * @return 刪除之后的FeatureInfo數組 */ 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()]); }運行測試代碼后Logcat輸出

可以看到bluetooth相關的feature已經沒有了

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)

總結 不直接使用Mock,而是使用Spy,最大限度保持測試環境真實可靠,從而保證測試效果 測試代碼不要放在test目錄,要放在androidTest目錄,保證在真實設備上跑(不然代碼也會報錯)。目錄結構如下:

如何使用Mock修改Android設備上的features

以上就是如何使用Mock修改Android設備上的features的詳細內容,更多關于Mock修改Android features的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲精品一区二| 鲁大师影院一区二区三区| 亚洲欧美日韩一区二区三区在线观看 | 欧美特级限制片免费在线观看| 色乱码一区二区三区88| 91精品国产福利在线观看| 国产午夜精品福利| 亚洲一区二区欧美日韩| 免费在线观看一区二区三区| 从欧美一区二区三区| 欧美日本一区二区视频在线观看| 99精品视频网| 国产精品视频你懂的| 丝袜美腿高跟呻吟高潮一区| 国产一区美女在线| 欧美a级片网站| 一本大道久久a久久综合婷婷| 久久伊人中文字幕| 一区二区三区产品免费精品久久75| 韩国成人精品a∨在线观看| 国产精品v日韩精品v欧美精品网站| 一区二区视频欧美| 黄色亚洲免费| 亚洲国产精品传媒在线观看| 亚洲aⅴ怡春院| 99精品偷自拍| 91国偷自产一区二区三区成为亚洲经典| 亚洲综合色视频| 国产精品久久久久久久免费软件 | 久久9热精品视频| 尤物精品在线| 日韩丝袜美女视频| 亚洲制服欧美中文字幕中文字幕| 亚洲国产一区二区三区在线播| 亚洲色图第一区| 高清在线成人网| 鲁大师成人一区二区三区| 亚洲线精品一区二区三区八戒| 色综合色狠狠综合色| 91国产丝袜在线播放| 国产最新精品精品你懂的| 在线播放国产精品二区一二区四区| 久久久久久久一区| 久久精品国产一区二区三| 欧美老人xxxx18| 国产iv一区二区三区| 久久久无码精品亚洲日韩按摩| 欧美精品大片| 亚洲精品高清在线| 91蜜桃网址入口| 在线免费精品视频| 樱花影视一区二区| 久久一二三区| 亚洲精品日产精品乱码不卡| 亚洲欧美日韩国产综合精品二区| 国产午夜亚洲精品不卡| 亚洲小说欧美另类社区| 亚洲一区在线观看免费| 欧洲激情一区二区| 懂色av中文一区二区三区| 欧美激情 亚洲a∨综合| 国产酒店精品激情| 国产精品不卡一区| 粉嫩欧美一区二区三区高清影视| 麻豆精品精品国产自在97香蕉| 免费在线亚洲| 免费人成网站在线观看欧美高清| 日韩欧美久久久| 一区二区三区四区在线免费观看| 久久99精品久久久久久动态图| 激情综合网激情| 视频一区国产视频| 亚洲午夜电影在线观看| 国产精品久久午夜夜伦鲁鲁| 亚洲精品视频在线| 亚洲主播在线观看| 久久精品夜色噜噜亚洲aⅴ| 中文字幕精品三区| 中文字幕在线一区| 精品视频一区 二区 三区| 久久久久久国产精品mv| 国产精品一区二区男女羞羞无遮挡 | 亚洲一区二区三区四区在线免费观看 | 国产精品久久久久久久久晋中| 久久国产精品一区二区三区四区| 国产老肥熟一区二区三区| 中文字幕中文字幕在线一区 | 夜夜精品视频| 国产精品国产三级国产有无不卡 | 亚洲人体大胆视频| 国产一区在线精品| 一区二区三区在线影院| 538在线一区二区精品国产| 亚洲成人自拍视频| 国产成人欧美日韩在线电影| 欧美日韩精品欧美日韩精品一综合| 久久九九影视网| 久久久精品性| 97精品国产露脸对白| 日本女人一区二区三区| 色综合久久久网| 91在线视频观看| 免费看黄色91| 18涩涩午夜精品.www| 欧美精品一级二级| 伊人婷婷久久| 国产91精品一区二区| 午夜亚洲国产au精品一区二区| 欧美亚洲一区二区三区| 成人开心网精品视频| 香蕉成人伊视频在线观看| 国产夜色精品一区二区av| 欧美性猛交一区二区三区精品| 精品成人在线| 成人动漫中文字幕| 国产精品久久久久影院老司| 欧美裸体一区二区三区| 国产精品日本一区二区 | 亚洲私拍自拍| 国产69精品久久久久777| 午夜精品一区在线观看| 日本一区二区成人在线| 日韩一区二区免费视频| 一本到一区二区三区| 亚洲国产一区二区精品专区| 99re在线精品| 久久99热狠狠色一区二区| 综合久久给合久久狠狠狠97色 | 99riav一区二区三区| 久久9热精品视频| 亚洲免费在线观看| 久久久国产午夜精品| 欧美色大人视频| 国产精品嫩草99av在线| 韩日成人在线| 99久久er热在这里只有精品66| 国产一区二区三区不卡在线观看| 亚洲va欧美va人人爽午夜| 亚洲视频一区二区在线观看| 精品国产成人在线影院| 亚洲无线一线二线三线区别av| 国产精品中文字幕欧美| 性久久久久久久久久久久| 亚洲丝袜制服诱惑| 国产欧美综合色| 免费在线成人| 亚洲国产精品www| 欧美日韩一区在线播放| 成人动漫一区二区| 国产成人在线观看免费网站| 日韩一区精品字幕| 亚洲一区在线看| 亚洲免费av网站| 亚洲视频你懂的| 欧美国产日韩精品免费观看| 久久日韩粉嫩一区二区三区 | 中文精品视频一区二区在线观看| 欧美在线国产| 99久久精品免费看国产免费软件| 蜜臀av国产精品久久久久| 亚洲地区一二三色| 一区二区三区在线影院| 亚洲桃色在线一区| 亚洲欧美偷拍卡通变态| 日韩一区中文字幕| 中文字幕成人网| 日本一区二区三区四区在线视频| 日韩午夜在线观看| 欧美一级国产精品| 欧美日韩免费不卡视频一区二区三区| 成人免费毛片aaaaa**| 国产麻豆一精品一av一免费 | 亚洲色图制服诱惑 | 亚洲成人一区二区在线观看| 中文字幕一区二区三区乱码在线 | 久久综合九色99| 亚洲最新在线| 亚洲承认在线| 精品成人在线| 影音先锋国产精品| 欧美成人69av| 午夜精品久久久久99热蜜桃导演 | 五月天一区二区三区| 亚洲精品国产一区二区三区四区在线 | 欧美大片专区| 91一区二区三区在线观看| 国产成人高清在线| 国产一区在线精品| 国产一区高清在线| 国产伦精品一区二区三区免费迷| 久久97超碰国产精品超碰| 另类的小说在线视频另类成人小视频在线| 日韩电影免费在线看| 麻豆91在线播放免费| 国产一区二区看久久| jlzzjlzz亚洲女人18| 日本午夜精品视频在线观看| 另类专区欧美蜜桃臀第一页| 韩国欧美国产1区| 成人app软件下载大全免费|