电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:36日期: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
相關文章:
主站蜘蛛池模板: 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 储气罐,真空罐,缓冲罐,隔膜气压罐厂家批发价格,空压机储气罐规格型号-上海申容压力容器集团有限公司 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 通用磨耗试验机-QUV耐候试验机|久宏实业百科 | 环球周刊网| 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | 一氧化氮泄露报警器,二甲苯浓度超标报警器-郑州汇瑞埔电子技术有限公司 | 宝鸡市人民医院 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 包装机_厂家_价格-山东包装机有限公司 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 西安微信朋友圈广告投放_微信朋友圈推广_西安度娘网络科技有限公司 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 工业CT-无锡璟能智能仪器有限公司| 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 99文库_实习生实用的范文资料文库站 | 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 彩超机-黑白B超机-便携兽用B超机-多普勒彩超机价格「大为彩超」厂家 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 定做大型恒温循环水浴槽-工业用不锈钢恒温水箱-大容量低温恒温水槽-常州精达仪器 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 正压密封性测试仪-静态发色仪-导丝头柔软性测试仪-济南恒品机电技术有限公司 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 西门子伺服电机维修,西门子电源模块维修,西门子驱动模块维修-上海渠利 |