首页
About
友情链接
Search
1
V2ray配置文件翻译
1,357 阅读
2
draw.io(diagrams.net) - 免费开源全平台绘图软件
1,107 阅读
3
Android 11 中的软件包可见性
909 阅读
4
Windows常用软件
829 阅读
5
Android Studio单元测试的编码过程
657 阅读
Uncategorized
Software
Android
Linux
Communist Party of China
Docker
Windows
Tools
登录
Search
Leon
累计撰写
34
篇文章
累计收到
23
条评论
首页
栏目
Uncategorized
Software
Android
Linux
Communist Party of China
Docker
Windows
Tools
页面
About
友情链接
搜索到
34
篇与
Leon
的结果
2021-09-01
Android 11 中的软件包可见性
官方文档:Android 11 中的软件包可见性 这个特性直接导致了如下错误:如果不在content provider的client的AndroidManifest.xml声明标签: <queries> <package android:name="com.fxkxb.mycontentprovider" /> <provider android:authorities="com.fxkxb.mycontentprovider.provider"/> </queries> <uses-permission android:name="com.fxkxb.mycontentprovider"/>就会导致Failed to find provider info for错误。
2021年09月01日
909 阅读
1 评论
1 点赞
2021-08-31
draw.io(diagrams.net) - 免费开源全平台绘图软件
draw.io(diagrams.net)是一个免费的开源绘图软件,可以使用在线网站的前端APP也可以下载全平台支持的桌面版。draw.io(diagrams.net)可以画出各种各样的图:流程图、思维导图、组织结构图、韦恩图、时序图、信息图表、网络架构图、平面图、UML 图等等。进入APP默认英文,点击右上角小地球可切换语言。官网:diagrams.net,APP网站:app.diagrams.net,也可以使用:draw.io访问开源地址:https://github.com/jgraph/drawio桌面版下载地址:https://github.com/jgraph/drawio-desktop考虑到GitHub访问速度,这里提供了14.9.6版本Win64与Ubuntu64的网盘下载:蓝奏云:https://wwa.lanzoui.com/b0bfurluf密码:drg7天翼云:https://cloud.189.cn/t/UJbA73QzYJZr百度云:https://pan.baidu.com/s/1oamr71AspODdwhzjPwh7Qg 提取码:8888项目发布页:感兴趣的话可以自己使用Docker容器搭建一个,Docker项目地址:https://github.com/jgraph/docker-drawio搭建方法:拉取镜像:docker pull fjudith/draw.io执行docker run命令,后台运行开机自启,运行在8080端口:docker run -dit --restart=always --name=draw -p 8080:8080 fjudith/draw.io搭建效果:Flowchart Maker & Online Diagram Software (fxkxb.com)
2021年08月31日
1,107 阅读
0 评论
0 点赞
2021-08-23
V2ray配置文件翻译
// Config file of V2Ray. This file follows standard JSON format, with comments support. // Uncomment entries below to satisfy your needs. Also read our manual for more detail at // https://www.v2fly.org/ // V2Ray的配置文件。 该文件遵循标准的JSON格式,支持注释。 // 取消注释后的项目以满足您的需要。另请阅读我们的手册以获取更多详细信息 { // 日志配置,表示 V2Ray 如何输出日志。 "log": { // By default, V2Ray writes access log to stdout. // 默认情况下,V2Ray访问日志标准输出写入文件。 // "access": "/path/to/access/log/file", // By default, V2Ray write error log to stdout. // 默认情况下,V2Ray错误日志标准输出写入文件。 // "error": "/path/to/error/log/file", // Log level, one of "debug", "info", "warning", "error", "none" // 日志的级别, 期望值:"debug", "info", "warning", "error", "none" "loglevel": "warning" }, // List of inbound proxy configurations. // 入站代理配置列表。 "inbounds": [ // 一个数组,每个元素是一个入站连接配置。 { // Port to listen on. You may need root access if the value is less than 1024. // 监听端口。如果端口号小于1024则需要root权限。 "port": 1080, // IP address to listen on. Change to "0.0.0.0" to listen on all network interfaces. // 监听地址。改成“0.0.0.0”来监听所有网络接口。 "listen": "127.0.0.1", // Tag of the inbound proxy. May be used for routing. // 入站代理标签。可用于路由。 "tag": "socks-inbound", // Protocol name of inbound proxy. // 入站代理的协议名称。 "protocol": "socks", // Settings of the protocol. Varies based on protocol. // 协议的设置。因协议而异。 "settings": { "auth": "noauth", "udp": false, "ip": "127.0.0.1" }, // Enable sniffing on TCP connection. // 在TCP连接上启用嗅探。 "sniffing": { "enabled": true, // Target domain will be overriden to the one carried by the connection, if the connection is HTTP or HTTPS. // 如果连接是HTTP或HTTPS,目标域将被覆盖为连接携带的域。 "destOverride": ["http", "tls"] } }], // List of outbound proxy configurations. // 出站代理配置列表。 "outbounds": [ // 一个数组,每个元素是一个出站连接配置。列表中的第一个元素作为主出站协议。当路由匹配不存在或没有匹配成功时,流量由主出站协议发出。 { // Protocol name of the outbound proxy. // 出站代理的协议名称。 "protocol": "freedom", // Settings of the protocol. Varies based on protocol. // 协议设置。因协议而异。 "settings": {}, // Tag of the outbound. May be used for routing. // 出站代理标签。可用于路由。 "tag": "direct" },{ "protocol": "blackhole", "settings": {}, "tag": "blocked" }], // Transport is for global transport settings. If you have multiple transports with same settings // (say mKCP), you may put it here, instead of in each individual inbound/outbounds. // 传输用于全局传输设置。 如果您有多个具有相同设置的传输 //(比如mKCP),你可以把它放在这里,而不是在每个单独的入站/出站。 //"transport": {}, // 用于配置 V2Ray 如何与其它服务器建立和使用网络连接。 // Routing controls how traffic from inbounds are sent to outbounds. // 路由控制如何将来自入站的流量发送到出站。 "routing": { // 路由配置。 "domainStrategy": "IPOnDemand", "rules":[ { // Blocks access to private IPs. Remove this if you want to access your router. // 阻止对私有IP的访问。如果您想访问您的路由器,请删除它。 "type": "field", "ip": ["geoip:private"], "outboundTag": "blocked" }, { // Blocks major ads. // 阻止主要广告。 "type": "field", "domain": ["geosite:category-ads"], "outboundTag": "blocked" } ] }, // Dns settings for domain resolution. // 域名解析的 Dns 设置。 "dns": { // 内置的DNS服务器,若此项不存在,则默认使用本机的DNS设置。 // Static hosts, similar to hosts file. // 静态hosts,类似于主机文件。 "hosts": { // Match v2fly.org to another domain on CloudFlare. This domain will be used when querying IPs for v2fly.org. // 将v2fly.org匹配到CloudFlare上的另一个域名。 查询v2fly.org的IPs时将使用此域。 "domain:v2fly.org": "www.vicemc.net", // The following settings help to eliminate DNS poisoning in mainland China. // It is safe to comment these out if this is not the case for you. // 以下设置有助于消除中国大陆的DNS污染。 // 如果您不是这种情况,可以安全地将这些注释掉。 "domain:github.io": "pages.github.com", "domain:wikipedia.org": "www.wikimedia.org", "domain:shadowsocks.org": "electronicsrealm.com" }, "servers": [ "1.1.1.1", { "address": "114.114.114.114", "port": 53, // List of domains that use this DNS first. // 优先使用此DNS的域名列表。 "domains": [ "geosite:cn" ] }, "8.8.8.8", "localhost" ] }, // Policy controls some internal behavior of how V2Ray handles connections. // It may be on connection level by user levels in 'levels', or global settings in 'system.' // 策略控制V2Ray如何处理连接的一些内部行为。 // 它可能在'levels'中的用户级别的连接级别,或'system'中的全局设置。 "policy": { // Connection policys by user levels // 用户级别的连接策略 // 本地策略可进行一些权限相关的配置。 "levels": { "0": { "uplinkOnly": 0, "downlinkOnly": 0 } }, "system": { "statsInboundUplink": false, "statsInboundDownlink": false, "statsOutboundUplink": false, "statsOutboundDownlink": false } }, // Stats enables internal stats counter. // This setting can be used together with Policy and Api. // Stats启用内部统计计数器。 // 此设置可以与Policy和Api一起使用。 //"stats":{}, // 当此项存在时,开启统计信息。 // Api enables gRPC APIs for external programs to communicate with V2Ray instance. // Api为外部程序启用gRPC API与V2Ray实例通信。 //"api": { // 内置的远程控置 API。 //"tag": "api", //"services": [ // "HandlerService", // "LoggerService", // "StatsService" //] //}, // You may add other entries to the configuration, but they will not be recognized by V2Ray. // 您可以在配置中添加其他项目,但它们不会被V2Ray识别。 // "reverse": {}, // 反向代理配置。 "other": {} }
2021年08月23日
1,357 阅读
0 评论
0 点赞
2021-08-23
Shell基础
Shell基础Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell.png简单入门--Hello World脚本格式 脚本以#!/bin/bash开头(指定解析器)helloworld.sh中输入如下内容#!/bin/bash echo "helloworld"脚本的常用执行方式 第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)多命令处理 在home/ts目录下新建ts.txt并写入I love ThunderSoft.#!/bin/bash cd /home/ts touch ts.txt echo "I love ThunderSoft." >>ts.txt变量变量默认为字符串类型不能进行数值运算。常用系统变量$HOME 当前用户home目录 $PWD 当前目录 $SHELL 默认解析器 $USER 当前用户自定义变量 A=1=两边不能有空格,若有空格需要引号。 unset 释放变量静态变量readonly B=1(不能unset)全局变量export B 可供其它shell使用。特殊变量$n 参数$# 获取输入的所有参数 $* 获取所有参数(看做整体) $@ 获取所有参数(分别获取) $? 获取最后一次执行的状态 0正确执行 !0错误执行 file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值: ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt ${file#*.}:删掉第一个 . 及其左边的字符串:file.txt ${file##*.}:删掉最后一个 . 及其左边的字符串:txt ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3 ${file%%/*}:删掉第一个 / 及其右边的字符串:(空值) ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my运算符"$((运算式))"或"$[运算式]"expr + , - , \*, /, % 加,减,乘,除,取余 expr运算符间要有空格For Example:expr 2 + 3 expr `expr 2 + 3` \* 4条件判断基本语法[ condition ](注意condition前后要有空格) 注意:条件非空即为true,[ ts ]返回true,[] 返回false。常用判断条件两个整数之间比较= 字符串比较-lt 小于(less than) -le 小于等于(less equal)-eq 等于(equal) -gt 大于(greater than)-ge 大于等于(greater equal) -ne 不等于(Not equal)按照文件权限进行判断-r 有读的权限(read) -w 有写的权限(write)-x 有执行的权限(execute)按照文件类型进行判断-f 文件存在并且是一个常规的文件(file)-e 文件存在(existence) -d 文件存在并是一个目录(directory)多条件判断&& 表示前一条命令执行成功时,才执行后一条命令|| 表示上一条命令执行失败后,才执行下一条命令流程控制if判断基本语法if [ 条件判断式 ];then 程序 fi 或者 if [ 条件判断式 ] then 程序 fi注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格(2)if后要有空格输入一个数字,如果是1,则输出1,如果是2,则输出2,如果是其它,什么也不输出。#!/bin/bash if [ $1 -eq "1" ] then echo "1" elif [ $1 -eq "2" ] then echo "2" ficase语句基本语法case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac注意事项:1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。 1) 双分号“;;”表示命令序列结束,相当于java中的break。 1) 最后的“*)”表示默认模式,相当于java中的default。输入一个数字,如果是1,则输出1,如果是2,则输出2,如果是其它,输出0。#!/bin/bash case $1 in "1") echo "1" ;; "2") echo "2" ;; *) echo "0" ;; esacfor循环基本语法1for (( 初始值;循环控制条件;变量变化 )) do 程序 done从1加到100#!/bin/bash s=0 for((i=0;i<=100;i++)) do s=$[$s+$i] done echo $s基本语法2for 变量 in 值1 值2 值3…do 程序 done打印输入的所有数字#!/bin/bash for i in $* do echo " $i " donewhile循环基本语法while [ 条件判断式 ] do 程序done从1加到100#!/bin/bashs=0i=1while [ $i -le 100 ]do=$[$s+$i]i=$[$i+1]doneecho $sread读取控制台输入基本语法read(选项)(参数)选项:-p:指定读取值时的提示符;-t:指定读取值时等待的时间(秒)。参数变量:指定读取值的变量名#!/bin/bashread -t 7 -p "Please input you name." NAMEecho $NAME函数系统函数basename基本语法basename [string / pathname] [suffix] basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。dirname文件绝对路径自定义函数基本语法 [ function ] funname[()] { Action; [return int;] } funname 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255) 2. 计算输入两参数的和 #!/bin/bash function sum(){ s=0s=$[ $1 + $2 ] echo "$s"} read -p "Please input the number1: " n1; read -p "Please input the number2: " n2; sum $n1 $n2; #### Shell工具 1. cut cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。 基本用法 cut [选项参数] filename | 选项参数 | 功能 | | -------- | ---------------------------- | | -f | 列号,提取第几列 | | -d | 分隔符,按照指定分隔符分割列 | 切割ts.txt第一列 cut -d " " -f 1 ts.txt 切ts.txt第二、三列 cut -d " " -f 2,3 ts.txt 在ts.txt文件中切割出ts cat ts.txt | grep "ts" | cut -d " " -f 1 选取系统PATH变量值,第2个“:”开始后的所有路径: echo $PATH | cut -d: -f 2- 切割ifconfig 后打印的IP地址 ifconfig eth0 | grep "inet addr" | cut -d: -f 2 | cut -d" " -f1 2. sed sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 基本用法 sed [选项参数] ‘command’ filename | 选项参数 | 功能 | | -------- | ------------------------------------- | | -e | 直接在指令列模式上进行sed的动作编辑。 | | 命令 | 功能描述 | | ---- | ------------------------------------- | | *a* | 新增,a的后面可以接字串,在下一行出现 | | d | 删除 | | s | 查找并替换 | 将“ts”这个单词插入到ts.txt第二行下,打印。 sed '2a' ts sed.txt 注意:文件并没有改变 删除ts.txt文件所有包含wo的行 sed '/wo/d' ts.txt 将sed.txt文件中wo替换为ni sed 's/wo/ni/g' ts.txt 注意:‘g’表示global,全部替换 将ts.txt文件中的第二行删除并将wo替换为ni sed -e '2d' -e 's/wo/ni/g' ts.txt 3. awk 一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。 1. 基本用法 awk [选项参数] ‘pattern1{action1} pattern2{action2}...’ filename pattern:表示AWK在数据中查找的内容,就是匹配模式 action:在找到匹配内容时所执行的一系列命令 2. 选项参数说明 | 选项参数 | 功能 | | -------- | -------------------- | | -F | 指定输入文件折分隔符 | | -v | 赋值一个用户定义变量 | 搜索passwd文件以root关键字开头的所有行,并输出该行的第7列。 awk -F: '/^root/{print $7}' passwd 搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。 awk -F: '/^root/{print $1","$7}' passwd 注意:只有匹配了pattern的行才会执行action 只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"hi,/bin/ts"。 awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "hi,/bin/ts"}' /etc/passwd 注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。 将passwd文件中的用户id增加数值1并输出 awk -v i=1 -F: '{print $3+i}' /etc/passwd awk的内置变量 | 变量 | 说明 | | -------- | -------------------------------------- | | FILENAME | 文件名 | | NR | 已读的记录数 | | NF | 浏览记录的域的个数(切割后,列的个数) | 统计passwd文件名,每行的行号,每行的列数 awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' /etc/passwd 切割IP ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}' 查询sed.txt中空行所在的行号 awk '/^$/{print NR}' sed.txt 4. sort sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。 基本语法 sort(选项)(参数) | 选项 | 说明 | | -------------------------- | ------------------------ | | -n | 依照数值的大小排序 | | -r | 以相反的顺序来排序 | | -t | 设置排序时所用的分隔字符 | | -k | 指定需要排序的列 | | 参数:指定待排序的文件列表 | | 按照“:”分割后的第三列倒序排序。 sort -t : -nrk 3 sort.sh 实例:什么时候下班。 实例地址:https://github.com/fuhailong1998/offWorkTime!/bin/bash@auther: Leonecho 请输入您的上班时间。read timehour=${time%%.*}min=${time##*.}echo 想要误餐补吗?(18块)1要0不要。read flagcase "$flag" in1) if [ $min -gt 30 ] then hour=`expr $hour + 11` if [ `expr $min - 30` -lt 10 ] then min=0`expr $min - 30` else min=`expr $min - 30` fi elif [ $min -eq 30 ] then hour=`expr $hour + 11` min=00 else hour=`expr $hour + 10` min=`expr $min + 30` fi echo 您需要$hour:$min下班。 ;; 0) hour=`expr $hour + 8` echo 您需要$hour:$min下班。 ;; *) echo 输入有误!请规范输入,如"8.3"代表“8:03”。 exit; esac 执行:leon@fxkxb:~/sda/offWorkTime-main$ chmod +x offWorkTime leon@fxkxb:~/sda/offWorkTime-main$ ./offWorkTime 请输入您的上班时间。8.48想要误餐补吗?(18块)1要0不要。1您需要19:18下班。
2021年08月23日
296 阅读
0 评论
0 点赞
2021-08-13
Android Studio单元测试的编码过程
Android Studio单元测试的编码过程前言本次单元测试过程中遇到了很多很多很多很多问题,技术更新迭代速度实在是太快了,网上搜到的很多东西都过时了,这里找到了一个五年前印度小哥的教学录屏[1]......本来英语不好的我听着蹩脚的印度英语,实在是折磨QAQ....不过总体上按照他的步骤是可行的,期间遇到的各种问题也用过搜索解决了,最终磕磕绊绊完成了简单的单元测试编写。于是有了这篇技术总结。设置测试环境在测试开始前,首先添加 AndroidX Test API[2],以及为项目配置 Android 测试依赖项。最终的在应用的顶级 build.gradle 文件中,依赖项如下:dependencies { androidTestImplementation "org.mockito:mockito-core:2.18.0" androidTestImplementation 'androidx.test:runner:1.4.0' androidTestImplementation 'androidx.test:rules:1.4.0' androidTestImplementation 'org.hamcrest:hamcrest-library:1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0' implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' }同时确保 defaultConfig { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }使用Android Studio生成测试类鼠标标记要生成的类,按Alt+Enter,选择第一个。在创建测试类窗口中,测试库我们选择JUnit4。类名可以自定义,建议不要改。父类不选,目标包就是项目包名,勾选setUp和tearDown。最后在要测试的方法前打勾。点击OK。随即弹出窗口提示我们选择测试类类型,我们选Android的测试类。由此我们得到了一个测试类,按Shift+Ctrl+T可在测试类与Activity间切换,这里创建rule并实例化。 @Rule public ActivityTestRule<FirstActivity> mainActivityActivityTestRule = new ActivityTestRule<FirstActivity>(FirstActivity.class); private FirstActivity firstActivity = null; @Before public void setUp() throws Exception { firstActivity = mainActivityActivityTestRule.getActivity(); }这样我们就可以通过实例化的rule来获取页面元素。a Simple Example: 测试文本是否为空。UT代码:TextView t = firstActivity.findViewById(R.id.textView10); assertNull(t.getText()); 2. 点击测试方法左边的绿三角即可开始测试。 ![image-20210813060836192.png][4] 以我的程序为例,来测试LED小灯的点亮功能。@Test public void light() { firstActivity.power = true; TextView[] leds = {firstActivity.findViewById(R.id.textView4), firstActivity.findViewById(R.id.textView6), firstActivity.findViewById(R.id.textView5), firstActivity.findViewById(R.id.textView7)}; int[] ledStatus = {1, 1, 0, 0}; final Drawable.ConstantState drawable = leds[0].getBackground().getConstantState(); final Drawable.ConstantState drawable2 = leds[1].getBackground().getConstantState(); firstActivity.light(ledStatus,leds); final Drawable.ConstantState drawable1 = leds[0].getBackground().getConstantState(); final Drawable.ConstantState drawable3 = leds[1].getBackground().getConstantState(); assertEquals(drawable,drawable1); assertNotEquals(drawable2,drawable3); } 我的Activity部分。 public void light(int[] b, TextView[] t) { for (int i = 0; i < 4; i++) { switch (i) { case 0: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightred); } } else if (b[i]==-1){ break; }else { t[i].setBackgroundResource(R.drawable.light); } ; break; case 1: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightgreen); } } else if (b[i]==-1){ break; } else { t[i].setBackgroundResource(R.drawable.light); } ; break; case 2: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightblue); } } else if (b[i]==-1){ break; } else { t[i].setBackgroundResource(R.drawable.light); } ; break; case 3: if (b[i]==1) { if (power) { t[i].setBackgroundResource(R.drawable.lightup); } } else if (b[i]==-1){ break; } else { t[i].setBackgroundResource(R.drawable.light); } ; break; default: break; } } }点击测试类左边的双绿三角可开始测试类中全部测试方法的测试。 我的测试结果:参考文献Android app development for beginners - 26 - Android - Unit test for Activity - Activity Test Rule: https://www.youtube.com/watch?v=_TR6QcRozAgSet up project for AndroidX Test: https://developer.android.com/training/testing/set-up-projectBuild instrumented unit tests: https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests#javaAndroid单元测试(二):Mockito框架的使用: https://blog.csdn.net/qq_17766199/article/details/78450007Q&A on stackoverflow: https://stackoverflow.com/questions/13621407/getting-the-current-background-id-of-a-viewAndroid单元测试-对Activity的测试: https://blog.csdn.net/Double2hao/article/details/77160950
2021年08月13日
657 阅读
1 评论
0 点赞
1
...
4
5
6
7