Mock Agent 是一个无侵入式的 mock 工具,它使用 JavaAgent 技术,在运行时修改被 mock 的类的行为。
- dubbo(alibaba)
- dubbo(apache)
- feign
可对任意类进行mock
要使用 Mock Agent,需要在运行时添加以下参数:
-javaagent:/path/to/mock-agent.jar
其中,/path/to/mock-agent.jar
是 Mock Agent 的 jar 包路径。
或者通过添加依赖(JDK版本<=1.8)
<dependency>
<groupId>com.ea.agentloader</groupId>
<artifactId>ea-agent-loader</artifactId>
<version>1.0.3</version>
</dependency>
程序入口出添加
AgentLoader.loadAgentClass(MockAgent.class.getName(),"");
以下是一个使用 Mock Agent 对任意类mock的示例:
[
{
"applicationName": "Example",
"enabled": 1,
"interfaceName": "io.github.lancelothuxi.mock.agent.examples.ExampleService",
"methodName": "add",
"mockDataList": [
{
"data": "5",
"timeout": 0
}
],
"serverSideMock": 1,
"type": "dynamic"
}
]
public class Example {
public static void main(String[] args) throws Exception{
System.setProperty("MOCK_APPLICATION_NAME","Example");
System.setProperty("mock.agent.config.mode","file");
URL resource = Example.class.getClassLoader().getResource("mockconfig.json");
File file = new File(resource.toURI());
String path = file.getPath();
System.setProperty("mock.agent.config.file.path",path);
AgentLoader.loadAgentClass(MockAgent.class.getName(),"");
// 添加 Mock Agent 参数
// 创建被 mock 的类的实例
ExampleService service = new ExampleService();
// 调用被 mock 的方法
int result = service.add(1, 2);
//改变方法返回值,输出:result = 5
System.out.println("result = " + result);
}
}
class ExampleService {
public int add(int a, int b) {
return a + b;
}
}
以下是一个使用 Mock Agent 对dubbo调用mock的示例:
[
{
"applicationName": "Example",
"interfaceName": "io.github.lancelothuxi.mock.agent.examples.dubbo.GreetingsService",
"methodName": "sayHi",
"mockDataList": [
{
"data": " this is mock data ",
"timeout": 0
}
],
"type": "dubbo"
}
]
public class Application {
public static void main(String[] args) throws Exception {
System.setProperty("MOCK_APPLICATION_NAME","Example");
System.setProperty("mock.agent.config.mode","file");
URL resource = Example.class.getClassLoader().getResource("mockconfig.json");
File file = new File(resource.toURI());
String path = file.getPath();
System.setProperty("mock.agent.config.file.path",path);
AgentLoader.loadAgentClass(MockAgent.class.getName(),"");
DubboApacheExampleService dubboApacheExampleService =new DubboApacheExampleService();
String sayHelloByDubbo = dubboApacheExampleService.sayHelloByDubbo();
//输出: sayHelloByDubbo = this is mock data
System.out.println("sayHelloByDubbo = " + sayHelloByDubbo);
}
}
public interface GreetingsService {
String sayHi(String name);
}
更多示例请参考 examples 注意事项 Mock Agent 可能会影响被 mock 的类的性能。
许可 Mock Agent 采用 MIT 许可。