背景:
在测试过程中经常需要一种功能可以固定某些程序数据,特别是在写自动化测试用例时,这种需求尤为强烈。比如在做后端接口测试时,期望某些不影响业务逻辑的接口能返回固定值,于是想到是不是可以写一个后端mock服务接口,每次调用接口都返回固定值。实际这种方法多数情况下并不能解决我们的问题,因为我们测试的服务正常情况都是从固定开发地址进行请求,如果想改变这些请求地址必须修改后端服务配置,或者修改开发代码,将地址指向我们的测试mock服务。这种方式多数情况下是不可行的,开发怎么可能允许测试来修改他们代码呢?即使修改了,如果出现问题,能确认不是之前修改地址导致的吗?所以我们需要的mock方式应该是不修改任何开发代码的情况下,能够改变java应用的行为,来符合我们测试的需求。
前提条件:待hook的无论是Android 程序还是java后端服务都需要有root权限。
技术栈:java agent , javaassist
1. 新建java maven工程
pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>study</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.29.0-GA</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>9.3</version>
</dependency>
<dependency>
<groupId>com.sun</groupId>
<artifactId&