add faq and known issue doc

This commit is contained in:
金戟 2020-10-27 23:02:31 +08:00
parent ae134ac5ce
commit afecf4ddf5
4 changed files with 48 additions and 4 deletions

View File

@ -0,0 +1,10 @@
常见用户问题
---
**1. 如何Mock被测类中通过`@Autowired`初始化的字段?**
直接创建被测类对象,然后利用`Testable`访问私有成员的能力直接给这些字段赋值即可。
**2. 通过<u>接口对象或基类对象</u>指向派生类的实例,调用执行了派生类实现的方法。使用`@TestableMock`定义Mock方法时首个参数类型应该用 接口/基类 还是 派生类?**
应该使用 接口/基类 类型,参见`should_able_to_mock_override_method`测试用例。

23
docs/known-issues.md Normal file
View File

@ -0,0 +1,23 @@
已知问题
---
**1. 访问私有方法或私有成员代码在IDE提示语法错误**
使用`@EnablePrivateAccessor`注解后访问私有方法或成员变量虽然能正常通过编译但在IDE上依然会提示语法错误。
这个问题与使用`Lombok`工具库后使用生成的`getter`和`setter`会被IDE报语法错误一样需要通过IDE插件来解决。
当前`Testable`尚未提供相关插件。也可以改用`PrivateAccessor`工具类来访问私有成员来避免IDE的异常信息。
**2. 通过IDE运行单个测试用例时Mock功能失效**
这是由于IDE运行单个测试用例时只会运行`maven-surefire-plugin`插件,跳过了`testable-maven-plugin`插件执行导致Mock功能所需的JavaAgent没有随测试启动。
解决方法是在单元测试配置的"虚拟机参数VM Option"属性值末尾添加JavaAgent启动参数`-javaagent:${HOME}/.m2/repository/com/alibaba/testable/testable-agent/0.2.1/testable-agent-0.2.1.jar`
> PS请将路径中的版本号替换成实际使用的版本号
![idea-vm-option](https://testable-code.oss-cn-beijing.aliyuncs.com/idea-vm-option.png)
**3. Testable的`verify`方法只能验证调用次数,不能验证调用参数**
当前版本尚未实现对调用参数的验证功能,欢迎贡献代码。

View File

@ -1,5 +1,10 @@
# Release Note # Release Note
## v0.2.1
- support mock static method
- support mock kotlin companion object method
- support mock invoke by interface / base class object
## v0.2.0 ## v0.2.0
- use `TestableTool` class to expose test context and verify mock invoke - use `TestableTool` class to expose test context and verify mock invoke
- add `testable-maven-plugin` module to simplify javaagent configuration - add `testable-maven-plugin` module to simplify javaagent configuration

View File

@ -55,7 +55,7 @@
### Mock被测类的任意方法调用 ### Mock被测类的任意方法调用
**【1】覆写任意类的方法调用** **1. <u>覆写任意类的方法调用</u>**
在测试类里定义一个有`@TestableMock`注解的普通方法,使它与需覆写的方法名称、参数、返回值类型完全一致,然后在其参数列表首位再增加一个类型为该方法原本所属对象类型的参数。 在测试类里定义一个有`@TestableMock`注解的普通方法,使它与需覆写的方法名称、参数、返回值类型完全一致,然后在其参数列表首位再增加一个类型为该方法原本所属对象类型的参数。
@ -65,7 +65,7 @@
示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_common_method()`用例详细展示了这种用法。 示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_common_method()`用例详细展示了这种用法。
**【2】覆写被测类自身的成员方法** **2. <u>覆写被测类自身的成员方法</u>**
有时候在对某些方法进行测试时希望将被测类自身的另外一些成员方法Mock掉。 有时候在对某些方法进行测试时希望将被测类自身的另外一些成员方法Mock掉。
@ -73,7 +73,13 @@
详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_member_method()`用例。 详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_member_method()`用例。
**【3】覆写任意类的new操作** **3. <u>覆写任意类的静态方法</u>**
对于静态方法的Mock与普通方法相同。但需要注意的是对于静态方法传入Mock方法的第一个参数实际值始终是`null`。
详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_static_method()`用例。
**4. <u>覆写任意类的new操作</u>**
在测试类里定义一个有`@TestableMock`注解的普通方法,将注解的`targetMethod`参数写为"<init>",然后使该方法与要被创建类型的构造函数参数、返回值类型完全一致,方法名称随意。 在测试类里定义一个有`@TestableMock`注解的普通方法,将注解的`targetMethod`参数写为"<init>",然后使该方法与要被创建类型的构造函数参数、返回值类型完全一致,方法名称随意。
@ -81,7 +87,7 @@
详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_new_object()`用例。 详见示例项目文件`DemoServiceTest.java`中的`should_able_to_mock_new_object()`用例。
**【4】识别当前测试用例和调用来源** **5. <u>识别当前测试用例和调用来源</u>**
在Mock方法中可以通过`TestableTool.TEST_CASE`和`TestableTool.SOURCE_METHOD`来识别**当前运行的测试用例名称**和**进入该Mock方法前的被测类方法名称**,从而区分处理不同的调用场景。 在Mock方法中可以通过`TestableTool.TEST_CASE`和`TestableTool.SOURCE_METHOD`来识别**当前运行的测试用例名称**和**进入该Mock方法前的被测类方法名称**,从而区分处理不同的调用场景。